]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/toplevel.cpp
Don't do the wx cleanup if wxPython didn't do the initialization.
[wxWidgets.git] / src / msw / toplevel.cpp
index 83bebdb7f11911f216c04730360f0b61a5e9b669..8283ec20d63680fad47c24cc543ed5a1ac2c2982 100644 (file)
 
 #include "wx/msw/private.h"
 
+#ifndef ICON_BIG
+    #define ICON_BIG 1
+#endif
+
+#ifndef ICON_SMALL
+    #define ICON_SMALL 0
+#endif
+
 // ----------------------------------------------------------------------------
 // stubs for missing functions under MicroWindows
 // ----------------------------------------------------------------------------
@@ -64,21 +72,25 @@ extern const wxChar *wxCanvasClassName;
 // wxTopLevelWindowMSW implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// wxDialog helpers
+// ----------------------------------------------------------------------------
+
 // Dialog window proc
 LONG APIENTRY _EXPORT
-wxDlgProc(HWND WXUNUSED(hWnd), UINT message, WPARAM WXUNUSED(wParam), LPARAM WXUNUSED(lParam))
+wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 {
-    if ( message == WM_INITDIALOG )
+    switch ( message )
     {
-        // for this message, returning TRUE tells system to set focus to the
-        // first control in the dialog box
-        return TRUE;
-    }
-    else
-    {
-        // for all the other ones, FALSE means that we didn't process the
-        // message
-        return FALSE;
+        case WM_INITDIALOG:
+            // for this message, returning TRUE tells system to set focus to the
+            // first control in the dialog box
+            return TRUE;
+
+        default:
+            // for all the other ones, FALSE means that we didn't process the
+            // message
+            return FALSE;
     }
 }
 
@@ -217,10 +229,13 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate,
         }
     }
 
-    m_hWnd = (WXHWND)::CreateDialogIndirect(wxGetInstance(),
-                                    (DLGTEMPLATE*)dlgTemplate,
-                                    parent ? GetHwndOf(parent) : NULL,
-                                    (DLGPROC)wxDlgProc);
+    m_hWnd = (WXHWND)::CreateDialogIndirect
+                       (
+                        wxGetInstance(),
+                        (DLGTEMPLATE*)dlgTemplate,
+                        parent ? GetHwndOf(parent) : NULL,
+                        (DLGPROC)wxDlgProc
+                       );
 
     if ( !m_hWnd )
     {
@@ -344,36 +359,37 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent,
 
     if ( GetExtraStyle() & wxTOPLEVEL_EX_DIALOG )
     {
-        // TODO: it would be better to construct the dialog template in memory
-        //       during run-time than to rely on the limited number of
-        //       templates in wx.rc because:
-        //          a) you wouldn't have to include wx.rc in all wxWin programs
-        //             (and the number of complaints about it would dtop)
-        //          b) we'd be able to provide more templates simply, i.e.
-        //             we could generate the templates for all style
-        //             combinations
-
         // we have different dialog templates to allows creation of dialogs
         // with & without captions under MSWindows, resizeable or not (but a
         // resizeable dialog always has caption - otherwise it would look too
         // strange)
-        int dlgsize = sizeof(DLGTEMPLATE) + (sizeof(WORD) * 3);
-        DLGTEMPLATE* dlgTemplate = (DLGTEMPLATE*)malloc( dlgsize );
-        memset (dlgTemplate, 0, dlgsize );
+
+        // we need 3 additional WORDs for dialog menu, class and title (as we
+        // don't use DS_SETFONT we don't need the fourth WORD for the font)
+        static const int dlgsize = sizeof(DLGTEMPLATE) + (sizeof(WORD) * 3);
+        DLGTEMPLATE *dlgTemplate = (DLGTEMPLATE *)malloc(dlgsize);
+        memset(dlgTemplate, 0, dlgsize);
+
+        // these values are arbitrary, they won't be used normally anyhow
         dlgTemplate->x  = 34;
         dlgTemplate->y  = 22;
         dlgTemplate->cx = 144;
         dlgTemplate->cy = 75;
 
-        if ( style & wxRESIZE_BORDER )
-          dlgTemplate->style = DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_THICKFRAME;
-        else if ( style & wxCAPTION )
-          dlgTemplate->style = DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU;
-        else
-          dlgTemplate->style = WS_POPUP;
+        // reuse the code in MSWGetStyle() but correct the results slightly for
+        // the dialog
+        dlgTemplate->style = MSWGetStyle(style, NULL);
+
+        // all dialogs are popups
+        dlgTemplate->style |= WS_POPUP;
+
+        // force 3D-look if necessary, it looks impossibly ugly otherwise
+        if ( style & (wxRESIZE_BORDER | wxCAPTION) )
+            dlgTemplate->style |= DS_MODALFRAME;
 
         bool ret = CreateDialog(dlgTemplate, title, pos, size);
         free(dlgTemplate);
+
         return ret;
     }
     else // !dialog
@@ -580,14 +596,26 @@ bool wxTopLevelWindowMSW::ShowFullScreen(bool show, long style)
 
 void wxTopLevelWindowMSW::SetIcon(const wxIcon& icon)
 {
-    // this sets m_icon
-    wxTopLevelWindowBase::SetIcon(icon);
+    SetIcons( wxIconBundle( icon ) );
+}
+
+void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons)
+{
+    wxTopLevelWindowBase::SetIcons(icons);
 
 #if defined(__WIN95__) && !defined(__WXMICROWIN__)
-    if ( m_icon.Ok() )
+    const wxIcon& sml = icons.GetIcon( wxSize( 16, 16 ) );
+    if( sml.Ok() && sml.GetWidth() == 16 && sml.GetHeight() == 16 )
+    {
+        ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_SMALL,
+                       (LPARAM)GetHiconOf(sml) );
+    }
+
+    const wxIcon& big = icons.GetIcon( wxSize( 32, 32 ) );
+    if( big.Ok() && big.GetWidth() == 32 && big.GetHeight() == 32 )
     {
-        ::SendMessage(GetHwnd(), WM_SETICON,
-                      (WPARAM)TRUE, (LPARAM)GetHiconOf(m_icon));
+        ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_BIG,
+                       (LPARAM)GetHiconOf(big) );
     }
 #endif // __WIN95__
 }