]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/toplevel.cpp
Fixed toolbar crash for MinGW/Cygwin
[wxWidgets.git] / src / msw / toplevel.cpp
index 4482e103d9e1ec1feb45945cb2f5e253ecc0d43f..e77677c7d40645d6afe677aee0f383780a00a0a3 100644 (file)
@@ -104,36 +104,43 @@ void wxTopLevelWindowMSW::Init()
 long wxTopLevelWindowMSW::MSWGetCreateWindowFlags(long *exflags) const
 {
     long style = GetWindowStyle();
-    long msflags = 0;
 
     // first select the kind of window being created
+    //
+    // note that if we don't set WS_POPUP, Windows assumes WS_OVERLAPPED and
+    // creates a window with both caption and border, hence we also test it
+    // below in some other cases
+    long msflags;
+    if ( style & wxFRAME_TOOL_WINDOW )
+        msflags = WS_POPUP;
+    else
+        msflags = WS_OVERLAPPED;
+
+    // border and caption styles
+    if ( style & wxRESIZE_BORDER )
+        msflags |= WS_THICKFRAME;
+    else if ( !(style & wxBORDER_NONE) )
+        msflags |= WS_BORDER;
+    else
+        msflags |= WS_POPUP;
+
     if ( style & wxCAPTION )
-    {
-        if ( style & wxFRAME_TOOL_WINDOW )
-            msflags |= WS_POPUPWINDOW;
-        else
-            msflags |= WS_OVERLAPPED;
-    }
+        msflags |= WS_CAPTION;
     else
-    {
         msflags |= WS_POPUP;
-    }
 
     // next translate the individual flags
     if ( style & wxMINIMIZE_BOX )
         msflags |= WS_MINIMIZEBOX;
     if ( style & wxMAXIMIZE_BOX )
         msflags |= WS_MAXIMIZEBOX;
-    if ( style & wxTHICK_FRAME )
-        msflags |= WS_THICKFRAME;
     if ( style & wxSYSTEM_MENU )
         msflags |= WS_SYSMENU;
     if ( style & wxMINIMIZE )
         msflags |= WS_MINIMIZE;
     if ( style & wxMAXIMIZE )
         msflags |= WS_MAXIMIZE;
-    if ( style & wxCAPTION )
-        msflags |= WS_CAPTION;
+
     if ( style & wxCLIP_CHILDREN )
         msflags |= WS_CLIPCHILDREN;
 
@@ -170,15 +177,15 @@ long wxTopLevelWindowMSW::MSWGetCreateWindowFlags(long *exflags) const
             *exflags |= WS_EX_TOPMOST;
 
 #ifdef __WIN32__
-      if ( m_exStyle & wxFRAME_EX_CONTEXTHELP )
-        *exflags |= WS_EX_CONTEXTHELP;
+        if ( m_exStyle & wxFRAME_EX_CONTEXTHELP )
+            *exflags |= WS_EX_CONTEXTHELP;
 #endif // __WIN32__
     }
 
     return msflags;
 }
 
-bool wxTopLevelWindowMSW::CreateDialog(const wxChar *dlgTemplate,
+bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate,
                                        const wxString& title,
                                        const wxPoint& pos,
                                        const wxSize& size)
@@ -196,24 +203,31 @@ bool wxTopLevelWindowMSW::CreateDialog(const wxChar *dlgTemplate,
     {
         parent = wxTheApp->GetTopWindow();
 
-        // but don't use the window which is currently hidden as then the
-        // dialog would be hidden as well
-        if ( parent && !parent->IsShown() )
+        if ( parent )
         {
-            parent = NULL;
+            // don't use transient windows as parents, this is dangerous as it
+            // can lead to a crash if the parent is destroyed before the child
+            //
+            // also don't use the window which is currently hidden as then the
+            // dialog would be hidden as well
+            if ( (parent->GetExtraStyle() & wxWS_EX_TRANSIENT) ||
+                    !parent->IsShown() )
+            {
+                parent = NULL;
+            }
         }
     }
 
-    m_hWnd = (WXHWND)::CreateDialog(wxGetInstance(),
-                                    dlgTemplate,
+    m_hWnd = (WXHWND)::CreateDialogIndirect(wxGetInstance(),
+                                    (DLGTEMPLATE*)dlgTemplate,
                                     parent ? GetHwndOf(parent) : NULL,
                                     (DLGPROC)wxDlgProc);
 
     if ( !m_hWnd )
     {
-        wxFAIL_MSG(_("Did you forget to include wx/msw/wx.rc in your resources?"));
+        wxFAIL_MSG(_("Failed to create dialog. Incorrect DLGTEMPLATE?"));
 
-        wxLogSysError(_("Can't create dialog using template '%s'"), dlgTemplate);
+        wxLogSysError(_("Can't create dialog using memory template"));
 
         return FALSE;
     }
@@ -344,15 +358,24 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent,
         // with & without captions under MSWindows, resizeable or not (but a
         // resizeable dialog always has caption - otherwise it would look too
         // strange)
-        const wxChar *dlgTemplate;
+        int dlgsize = sizeof(DLGTEMPLATE) + (sizeof(WORD) * 3);
+        DLGTEMPLATE* dlgTemplate = (DLGTEMPLATE*)malloc( dlgsize );
+        memset (dlgTemplate, 0, dlgsize );
+        dlgTemplate->x  = 34;
+        dlgTemplate->y  = 22;
+        dlgTemplate->cx = 144;
+        dlgTemplate->cy = 75;
+
         if ( style & wxRESIZE_BORDER )
-            dlgTemplate = wxT("wxResizeableDialog");
+          dlgTemplate->style = DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_THICKFRAME;
         else if ( style & wxCAPTION )
-            dlgTemplate = wxT("wxCaptionDialog");
+          dlgTemplate->style = DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU;
         else
-            dlgTemplate = wxT("wxNoCaptionDialog");
+          dlgTemplate->style = WS_POPUP;
 
-        return CreateDialog(dlgTemplate, title, pos, size);
+        bool ret = CreateDialog(dlgTemplate, title, pos, size);
+        free(dlgTemplate);
+        return ret;
     }
     else // !dialog
     {
@@ -379,42 +402,6 @@ wxTopLevelWindowMSW::~wxTopLevelWindowMSW()
     }
 }
 
-// ----------------------------------------------------------------------------
-// wxTopLevelWindowMSW geometry
-// ----------------------------------------------------------------------------
-
-void wxTopLevelWindowMSW::DoSetClientSize(int width, int height)
-{
-    HWND hWnd = GetHwnd();
-
-    RECT rectClient;
-    ::GetClientRect(hWnd, &rectClient);
-
-    RECT rectTotal;
-    ::GetWindowRect(hWnd, &rectTotal);
-
-    // Find the difference between the entire window (title bar and all)
-    // and the client area; add this to the new client size to move the
-    // window
-    width += rectTotal.right - rectTotal.left - rectClient.right;
-    height += rectTotal.bottom - rectTotal.top - rectClient.bottom;
-
-    // note that calling GetClientAreaOrigin() takes the toolbar into account
-    wxPoint pt = GetClientAreaOrigin();
-    width += pt.x;
-    height += pt.y;
-
-    if ( !::MoveWindow(hWnd, rectTotal.left, rectTotal.top,
-                       width, height, TRUE /* redraw */) )
-    {
-        wxLogLastError(_T("MoveWindow"));
-    }
-
-    wxSizeEvent event(wxSize(width, height), m_windowId);
-    event.SetEventObject(this);
-    (void)GetEventHandler()->ProcessEvent(event);
-}
-
 // ----------------------------------------------------------------------------
 // wxTopLevelWindowMSW showing
 // ----------------------------------------------------------------------------