X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3135f4a7785f188af291c35ce5df6bdd13672300..285c163f987b73d7773c758db75a925d380764fa:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index a03d31788a..3528af8915 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -129,14 +129,10 @@ HBRUSH wxDisableButtonBrush = (HBRUSH) 0; LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM); -#if defined(__WIN95__) && !defined(__TWIN32__) - #define wxUSE_RICHEDIT 1 -#else - #define wxUSE_RICHEDIT 0 -#endif - #if wxUSE_RICHEDIT - static HINSTANCE gs_hRichEdit = (HINSTANCE) NULL; + // the handle to richedit DLL and the version of the DLL loaded + static HINSTANCE gs_hRichEdit = (HINSTANCE)NULL; + static int gs_verRichEdit = -1; #endif // =========================================================================== @@ -193,15 +189,6 @@ bool wxApp::Initialize() #if defined(__WIN95__) InitCommonControls(); -#if wxUSE_RICHEDIT - gs_hRichEdit = LoadLibrary(wxT("RICHED32.DLL")); - - if (gs_hRichEdit == (HINSTANCE) NULL) - { - wxLogError(_("Could not initialise Rich Edit DLL")); - } -#endif // wxUSE_RICHEDIT - #endif // __WIN95__ #if wxUSE_OLE @@ -226,6 +213,8 @@ bool wxApp::Initialize() g_globalCursor = new wxCursor; + // VZ: these icons are not in wx.rc anyhow (but should they?)! +#if 0 wxSTD_FRAME_ICON = LoadIcon(wxhInstance, wxT("wxSTD_FRAME")); wxSTD_MDIPARENTFRAME_ICON = LoadIcon(wxhInstance, wxT("wxSTD_MDIPARENTFRAME")); wxSTD_MDICHILDFRAME_ICON = LoadIcon(wxhInstance, wxT("wxSTD_MDICHILDFRAME")); @@ -233,6 +222,7 @@ bool wxApp::Initialize() wxDEFAULT_FRAME_ICON = LoadIcon(wxhInstance, wxT("wxDEFAULT_FRAME")); wxDEFAULT_MDIPARENTFRAME_ICON = LoadIcon(wxhInstance, wxT("wxDEFAULT_MDIPARENTFRAME")); wxDEFAULT_MDICHILDFRAME_ICON = LoadIcon(wxhInstance, wxT("wxDEFAULT_MDICHILDFRAME")); +#endif // 0 RegisterWindowClasses(); @@ -514,15 +504,11 @@ void wxApp::CleanUp() wxSetKeyboardHook(FALSE); -#ifdef __WIN95__ - #if wxUSE_RICHEDIT if (gs_hRichEdit != (HINSTANCE) NULL) FreeLibrary(gs_hRichEdit); #endif -#endif - #if wxUSE_PENWINDOWS wxCleanUpPenWin(); #endif @@ -620,7 +606,6 @@ int wxEntry(WXHINSTANCE hInstance, #else #undef CATCH_PROGRAM_EXCEPTIONS #endif - wxhInstance = (HINSTANCE) hInstance; if (!wxApp::Initialize()) @@ -648,6 +633,13 @@ int wxEntry(WXHINSTANCE hInstance, // but this call is provided for compatibility across platforms. wxTheApp->OnInitGui(); + // We really don't want timestamps by default, because it means + // we can't simply double-click on the error message and get to that + // line in the source. So VC++ at least, let's have a sensible default. +#ifdef __VISUALC__ + wxLog::SetTimestamp(NULL); +#endif + int retValue = 0; if ( wxTheApp->OnInit() ) @@ -1089,47 +1081,105 @@ void wxApp::OnQueryEndSession(wxCloseEvent& event) } } -int wxApp::GetComCtl32Version() const +#if wxUSE_RICHEDIT + +/* static */ +bool wxApp::InitRichEdit(int version) { - // have we loaded COMCTL32 yet? - HMODULE theModule = ::GetModuleHandle(wxT("COMCTL32")); - int version = 0; + wxCHECK_MSG( version >= 1 && version <= 3, FALSE, + _T("incorrect richedit control version requested") ); - // if so, then we can check for the version - if (theModule) + if ( version <= gs_verRichEdit ) { - // InitCommonControlsEx is unique to 4.7 and later - FARPROC theProc = ::GetProcAddress(theModule, "InitCommonControlsEx"); + // we've already got this or better + return TRUE; + } - if (! theProc) - { // not found, must be 4.00 - version = 400; - } - else + if ( gs_hRichEdit ) + { + ::FreeLibrary(gs_hRichEdit); + } + + // always try load riched20.dll first - like this we won't have to reload + // it later if we're first asked for RE 1 and then for RE 2 or 3 + wxString dllname = _T("riched20.dll"); + gs_hRichEdit = ::LoadLibrary(dllname); + if ( !gs_hRichEdit && (version == 1) ) + { + // fall back to RE 1 + dllname = _T("riched32.dll"); + gs_hRichEdit = ::LoadLibrary(dllname); + } + + if ( !gs_hRichEdit ) + { + wxLogSysError(_("Could not load Rich Edit DLL '%s'"), dllname.c_str()); + + gs_verRichEdit = -1; + + return FALSE; + } + + gs_verRichEdit = version; + + return TRUE; +} + +#endif // wxUSE_RICHEDIT + +/* static */ +int wxApp::GetComCtl32Version() +{ + // TODO should use DllGetVersion() instead of this hack + + // cache the result + static int s_verComCtl32 = -1; // MT-FIXME + + if ( s_verComCtl32 == -1 ) + { + s_verComCtl32 = 0; + + // have we loaded COMCTL32 yet? + HMODULE theModule = ::GetModuleHandle(wxT("COMCTL32")); + + // if so, then we can check for the version + if (theModule) { - // The following symbol are unique to 4.71 - // DllInstall - // FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos - // FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo - // FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange - // FlatSB_ShowScrollBar - // _DrawIndirectImageList _DuplicateImageList - // InitializeFlatSB - // UninitializeFlatSB - // we could check for any of these - I chose DllInstall - FARPROC theProc = ::GetProcAddress(theModule, "DllInstall"); - if (! theProc) - { - // not found, must be 4.70 - version = 470; + // InitCommonControlsEx is unique to 4.7 and later + FARPROC theProc = ::GetProcAddress(theModule, + _T("InitCommonControlsEx")); + + if ( !theProc ) + { // not found, must be 4.00 + s_verComCtl32 = 400; } else - { // found, must be 4.71 - version = 471; + { + // The following symbol are unique to 4.71 + // DllInstall + // FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos + // FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo + // FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange + // FlatSB_ShowScrollBar + // _DrawIndirectImageList _DuplicateImageList + // InitializeFlatSB + // UninitializeFlatSB + // we could check for any of these - I chose DllInstall + FARPROC theProc = ::GetProcAddress(theModule, _T("DllInstall")); + if ( !theProc ) + { + // not found, must be 4.70 + s_verComCtl32 = 470; + } + else + { // found, must be 4.71 + s_verComCtl32 = 471; + } } } } - return version; + + return s_verComCtl32; } void wxExit() @@ -1159,6 +1209,24 @@ bool wxYield() return TRUE; } +//----------------------------------------------------------------------------- +// wxWakeUpIdle +//----------------------------------------------------------------------------- + +void wxWakeUpIdle() +{ + // Send the top window a dummy message so idle handler processing will + // start up again. Doing it this way ensures that the idle handler + // wakes up in the right thread. + wxWindow *topWindow = wxTheApp->GetTopWindow(); + if ( topWindow ) { + HWND hWnd = (HWND)topWindow->GetHWND(); + ::PostMessage(hWnd, WM_NULL, 0, 0); + } +} + +//----------------------------------------------------------------------------- + wxIcon wxApp::GetStdIcon(int which) const {