]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
Don't send EVT_KILL_FOCUS when the window is in the process of being
[wxWidgets.git] / src / msw / app.cpp
index e77f69dd6518234b5e776f3796d4e182753fd1eb..a6ba1ee020db779c6967d83b57bc7e9c6723d706 100644 (file)
     #define _WIN32_IE 0x0200
 #endif
 
-#if _WIN32_IE >= 0x0300 && !defined(__MINGW32__)
+#if _WIN32_IE >= 0x0300 && \
+    (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 ))
     #include <shlwapi.h>
 #endif
 
@@ -136,16 +137,12 @@ wxApp *wxTheApp = NULL;
 
 // NB: all "NoRedraw" classes must have the same names as the "normal" classes
 //     with NR suffix - wxWindow::MSWCreate() supposes this
-const wxChar *wxFrameClassName         = wxT("wxFrameClass");
-const wxChar *wxFrameClassNameNoRedraw = wxT("wxFrameClassNR");
+const wxChar *wxCanvasClassName        = wxT("wxWindowClass");
+const wxChar *wxCanvasClassNameNR      = wxT("wxWindowClassNR");
 const wxChar *wxMDIFrameClassName      = wxT("wxMDIFrameClass");
 const wxChar *wxMDIFrameClassNameNoRedraw = wxT("wxMDIFrameClassNR");
 const wxChar *wxMDIChildFrameClassName = wxT("wxMDIChildFrameClass");
 const wxChar *wxMDIChildFrameClassNameNoRedraw = wxT("wxMDIChildFrameClassNR");
-const wxChar *wxPanelClassName         = wxT("wxPanelClass");
-const wxChar *wxPanelClassNameNR       = wxT("wxPanelClassNR");
-const wxChar *wxCanvasClassName        = wxT("wxCanvasClass");
-const wxChar *wxCanvasClassNameNR      = wxT("wxCanvasClassNR");
 
 HICON wxSTD_FRAME_ICON = (HICON) NULL;
 HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL;
@@ -322,6 +319,7 @@ bool wxApp::Initialize()
 bool wxApp::RegisterWindowClasses()
 {
     WNDCLASS wndclass;
+    wxZeroMemory(wndclass);
 
     // for each class we register one with CS_(V|H)REDRAW style and one
     // without for windows created with wxNO_FULL_REDRAW_ON_REPAINT flag
@@ -330,34 +328,26 @@ bool wxApp::RegisterWindowClasses()
 
     // the fields which are common to all classes
     wndclass.lpfnWndProc   = (WNDPROC)wxWndProc;
-    wndclass.cbClsExtra    = 0;
-    wndclass.cbWndExtra    = sizeof( DWORD ); // VZ: what is this DWORD used for?
     wndclass.hInstance     = wxhInstance;
-    wndclass.hIcon         = (HICON) NULL;
     wndclass.hCursor       = ::LoadCursor((HINSTANCE)NULL, IDC_ARROW);
-    wndclass.lpszMenuName  = NULL;
 
     // Register the frame window class.
     wndclass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);
-    wndclass.lpszClassName = wxFrameClassName;
+    wndclass.lpszClassName = wxCanvasClassName;
     wndclass.style         = styleNormal;
 
     if ( !RegisterClass(&wndclass) )
     {
         wxLogLastError(wxT("RegisterClass(frame)"));
-
-        return FALSE;
     }
 
     // "no redraw" frame
-    wndclass.lpszClassName = wxFrameClassNameNoRedraw;
+    wndclass.lpszClassName = wxCanvasClassNameNR;
     wndclass.style         = styleNoRedraw;
 
     if ( !RegisterClass(&wndclass) )
     {
         wxLogLastError(wxT("RegisterClass(no redraw frame)"));
-
-        return FALSE;
     }
 
     // Register the MDI frame window class.
@@ -368,8 +358,6 @@ bool wxApp::RegisterWindowClasses()
     if ( !RegisterClass(&wndclass) )
     {
         wxLogLastError(wxT("RegisterClass(MDI parent)"));
-
-        return FALSE;
     }
 
     // "no redraw" MDI frame
@@ -379,8 +367,6 @@ bool wxApp::RegisterWindowClasses()
     if ( !RegisterClass(&wndclass) )
     {
         wxLogLastError(wxT("RegisterClass(no redraw MDI parent frame)"));
-
-        return FALSE;
     }
 
     // Register the MDI child frame window class.
@@ -391,8 +377,6 @@ bool wxApp::RegisterWindowClasses()
     if ( !RegisterClass(&wndclass) )
     {
         wxLogLastError(wxT("RegisterClass(MDI child)"));
-
-        return FALSE;
     }
 
     // "no redraw" MDI child frame
@@ -402,51 +386,6 @@ bool wxApp::RegisterWindowClasses()
     if ( !RegisterClass(&wndclass) )
     {
         wxLogLastError(wxT("RegisterClass(no redraw MDI child)"));
-
-        return FALSE;
-    }
-
-    // Register the panel window class.
-    wndclass.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH );
-    wndclass.lpszClassName = wxPanelClassName;
-    wndclass.style         = styleNormal;
-
-    if ( !RegisterClass(&wndclass) )
-    {
-        wxLogLastError(wxT("RegisterClass(panel)"));
-
-        return FALSE;
-    }
-
-    // Register the no redraw panel window class.
-    wndclass.lpszClassName = wxPanelClassNameNR;
-    wndclass.style         = styleNoRedraw;
-
-    if ( !RegisterClass(&wndclass) )
-    {
-        wxLogLastError(wxT("RegisterClass(no redraw panel)"));
-
-        return FALSE;
-    }
-
-    // Register the canvas and textsubwindow class name
-    wndclass.hbrBackground = (HBRUSH)NULL;
-    wndclass.lpszClassName = wxCanvasClassName;
-
-    if ( !RegisterClass(&wndclass) )
-    {
-        wxLogLastError(wxT("RegisterClass(canvas)"));
-
-        return FALSE;
-    }
-
-    wndclass.lpszClassName = wxCanvasClassNameNR;
-    wndclass.style         = styleNoRedraw;
-    if ( !RegisterClass(&wndclass) )
-    {
-        wxLogLastError(wxT("RegisterClass(no redraw canvas)"));
-
-        return FALSE;
     }
 
     return TRUE;
@@ -461,24 +400,8 @@ bool wxApp::UnregisterWindowClasses()
     bool retval = TRUE;
 
 #ifndef __WXMICROWIN__
-    // frame window class.
-    if ( !UnregisterClass(wxFrameClassName, wxhInstance) )
-    {
-        wxLogLastError(wxT("UnregisterClass(frame)"));
-
-        retval = FALSE;
-    }
-
-    // "no redraw" frame
-    if ( !UnregisterClass(wxFrameClassNameNoRedraw, wxhInstance) )
-    {
-        wxLogLastError(wxT("UnregisterClass(no redraw frame)"));
-
-        return FALSE;
-    }
-
     // MDI frame window class.
-    if ( !UnregisterClass(wxMDIFrameClassName, wxhInstance) )
+    if ( !::UnregisterClass(wxMDIFrameClassName, wxhInstance) )
     {
         wxLogLastError(wxT("UnregisterClass(MDI parent)"));
 
@@ -486,7 +409,7 @@ bool wxApp::UnregisterWindowClasses()
     }
 
     // "no redraw" MDI frame
-    if ( !UnregisterClass(wxMDIFrameClassNameNoRedraw, wxhInstance) )
+    if ( !::UnregisterClass(wxMDIFrameClassNameNoRedraw, wxhInstance) )
     {
         wxLogLastError(wxT("UnregisterClass(no redraw MDI parent frame)"));
 
@@ -494,7 +417,7 @@ bool wxApp::UnregisterWindowClasses()
     }
 
     // MDI child frame window class.
-    if ( !UnregisterClass(wxMDIChildFrameClassName, wxhInstance) )
+    if ( !::UnregisterClass(wxMDIChildFrameClassName, wxhInstance) )
     {
         wxLogLastError(wxT("UnregisterClass(MDI child)"));
 
@@ -502,45 +425,29 @@ bool wxApp::UnregisterWindowClasses()
     }
 
     // "no redraw" MDI child frame
-    if ( !UnregisterClass(wxMDIChildFrameClassNameNoRedraw, wxhInstance) )
+    if ( !::UnregisterClass(wxMDIChildFrameClassNameNoRedraw, wxhInstance) )
     {
         wxLogLastError(wxT("UnregisterClass(no redraw MDI child)"));
 
         retval = FALSE;
     }
 
-    // panel window class.
-    if ( !UnregisterClass(wxPanelClassName, wxhInstance) )
-    {
-        wxLogLastError(wxT("UnregisterClass(panel)"));
-
-        retval = FALSE;
-    }
-
-    // no redraw panel window class.
-    if ( !UnregisterClass(wxPanelClassNameNR, wxhInstance) )
-    {
-        wxLogLastError(wxT("UnregisterClass(no redraw panel)"));
-
-        retval = FALSE;
-    }
-
-    // canvas and textsubwindow class name
-    if ( !UnregisterClass(wxCanvasClassName, wxhInstance) )
+    // canvas class name
+    if ( !::UnregisterClass(wxCanvasClassName, wxhInstance) )
     {
         wxLogLastError(wxT("UnregisterClass(canvas)"));
 
         retval = FALSE;
     }
 
-    if ( !UnregisterClass(wxCanvasClassNameNR, wxhInstance) )
+    if ( !::UnregisterClass(wxCanvasClassNameNR, wxhInstance) )
     {
         wxLogLastError(wxT("UnregisterClass(no redraw canvas)"));
 
         retval = FALSE;
     }
-#endif
-    // __WXMICROWIN__
+#endif // __WXMICROWIN__
+
     return retval;
 }
 
@@ -794,22 +701,8 @@ int wxEntry(WXHINSTANCE hInstance,
         wxLog::SetTimestamp(NULL);
 #endif
 
-        int retValue = 0;
-
-        // it is common to create a modal dialog in OnInit() (to ask/notify the
-        // user about something) but it wouldn't work if we don't change the
-        // "exit on delete last frame" flag here as when this dialog is
-        // deleted, the app would terminate (it was the last top level window
-        // as the main frame wasn't created yet!), so disable this behaviour
-        // temproarily
-        bool exitOnLastFrameDelete = wxTheApp->GetExitOnFrameDelete();
-        wxTheApp->SetExitOnFrameDelete(FALSE);
-
         // init the app
-        retValue = wxEntryInitGui() && wxTheApp->OnInit() ? 0 : -1;
-
-        // restore the old flag value
-        wxTheApp->SetExitOnFrameDelete(exitOnLastFrameDelete);
+        int retValue = wxEntryInitGui() && wxTheApp->OnInit() ? 0 : -1;
 
         if ( retValue == 0 )
         {
@@ -1004,16 +897,12 @@ bool wxApp::DoMessage()
             {
                 s_hadGuiLock = TRUE;
 
-                size_t count = s_aSavedMessages.Count();
+                size_t count = s_aSavedMessages.GetCount();
                 for ( size_t n = 0; n < count; n++ )
                 {
                     MSG& msg = s_aSavedMessages[n];
 
-                    if ( !ProcessMessage((WXMSG *)&msg) )
-                    {
-                        ::TranslateMessage(&msg);
-                        ::DispatchMessage(&msg);
-                    }
+                    DoMessage((WXMSG *)&msg);
                 }
 
                 s_aSavedMessages.Empty();
@@ -1083,8 +972,8 @@ bool wxApp::ProcessIdle()
 
 void wxApp::ExitMainLoop()
 {
-    // VZ: why not ::PostQuitMessage()?
-    m_keepGoing = FALSE;
+    // this will set m_keepGoing to FALSE a bit later
+    ::PostQuitMessage(0);
 }
 
 bool wxApp::Pending()
@@ -1481,29 +1370,6 @@ void wxWakeUpIdle()
 
 //-----------------------------------------------------------------------------
 
-wxIcon
-wxApp::GetStdIcon(int which) const
-{
-    switch(which)
-    {
-        case wxICON_INFORMATION:
-            return wxIcon("wxICON_INFO");
-
-        case wxICON_QUESTION:
-            return wxIcon("wxICON_QUESTION");
-
-        case wxICON_EXCLAMATION:
-            return wxIcon("wxICON_WARNING");
-
-        default:
-            wxFAIL_MSG(wxT("requested non existent standard icon"));
-            // still fall through
-
-        case wxICON_HAND:
-            return wxIcon("wxICON_ERROR");
-    }
-}
-
 // For some reason, with MSVC++ 1.5, WinMain isn't linked in properly
 // if in a separate file. So include it here to ensure it's linked.
 #if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__TWIN32__) && !defined(WXMAKINGDLL))