]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/toplevel.cpp
DOS compilation fixes
[wxWidgets.git] / src / msw / toplevel.cpp
index b5da266564757dffea826fadd076040bcfc11028..a7b917f9f112a95a58380147ff72a91930bb289f 100644 (file)
@@ -45,7 +45,7 @@
 
 #ifdef __WXMICROWIN__
 
-static inline bool IsIconic(HWND WXUNUSED(hwnd)) { return FALSE; }
+// static inline bool IsIconic(HWND WXUNUSED(hwnd)) { return FALSE; }
 static inline bool IsZoomed(HWND WXUNUSED(hwnd)) { return FALSE; }
 
 #endif // __WXMICROWIN__
@@ -196,11 +196,18 @@ 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;
+            }
         }
     }
 
@@ -252,35 +259,39 @@ bool wxTopLevelWindowMSW::CreateDialog(const wxChar *dlgTemplate,
 
     // move the dialog to its initial position without forcing repainting
     int x, y, w, h;
-    if ( MSWGetCreateWindowCoords(pos, size, x, y, w, h) )
+    if ( !MSWGetCreateWindowCoords(pos, size, x, y, w, h) )
     {
-        // we can't use CW_USEDEFAULT here as we're not calling CreateWindow()
-        // and passing CW_USEDEFAULT to MoveWindow() results in resizing the
-        // window to (0, 0) size which breaks quite a lot of things, e.g. the
-        // sizer calculation in wxSizer::Fit()
-        if ( w == CW_USEDEFAULT )
-        {
-            // the exact number doesn't matter, the dialog will be resized
-            // again soon anyhow but it should be big enough to allow
-            // calculation relying on "totalSize - clientSize > 0" work, i.e.
-            // at least greater than the title bar height
-            w =
-            h = 100;
-        }
+        x =
+        w = (int)CW_USEDEFAULT;
+    }
 
-        if ( x == CW_USEDEFAULT )
-        {
-            // well, where should we put it? maybe centre it on screen?
-            x =
-            y = 0;
-        }
+    // we can't use CW_USEDEFAULT here as we're not calling CreateWindow()
+    // and passing CW_USEDEFAULT to MoveWindow() results in resizing the
+    // window to (0, 0) size which breaks quite a lot of things, e.g. the
+    // sizer calculation in wxSizer::Fit()
+    if ( w == (int)CW_USEDEFAULT )
+    {
+        // the exact number doesn't matter, the dialog will be resized
+        // again soon anyhow but it should be big enough to allow
+        // calculation relying on "totalSize - clientSize > 0" work, i.e.
+        // at least greater than the title bar height
+        w =
+        h = 100;
+    }
 
-        if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) )
-        {
-            wxLogLastError(wxT("MoveWindow"));
-        }
+    if ( x == (int)CW_USEDEFAULT )
+    {
+        // centre it on the screen - what else can we do?
+        wxSize sizeDpy = wxGetDisplaySize();
+
+        x = (sizeDpy.x - w) / 2;
+        y = (sizeDpy.y - h) / 2;
+    }
+
+    if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) )
+    {
+        wxLogLastError(wxT("MoveWindow"));
     }
-    //else: leave it at default position
 
     if ( !title.empty() )
     {
@@ -601,3 +612,37 @@ void wxTopLevelWindowMSW::SetIcon(const wxIcon& icon)
     }
 #endif // __WIN95__
 }
+
+bool wxTopLevelWindowMSW::EnableCloseButton(bool enable)
+{
+#ifndef __WXMICROWIN__
+    // get system (a.k.a. window) menu
+    HMENU hmenu = ::GetSystemMenu(GetHwnd(), FALSE /* get it */);
+    if ( !hmenu )
+    {
+        wxLogLastError(_T("GetSystemMenu"));
+
+        return FALSE;
+    }
+
+    // enabling/disabling the close item from it also automatically
+    // disables/enables the close title bar button
+    if ( ::EnableMenuItem(hmenu, SC_CLOSE,
+                          MF_BYCOMMAND |
+                          (enable ? MF_ENABLED : MF_GRAYED)) == -1 )
+    {
+        wxLogLastError(_T("EnableMenuItem(SC_CLOSE)"));
+
+        return FALSE;
+    }
+
+    // update appearance immediately
+    if ( !::DrawMenuBar(GetHwnd()) )
+    {
+        wxLogLastError(_T("DrawMenuBar"));
+    }
+#endif // !__WXMICROWIN__
+
+    return TRUE;
+}
+