]> git.saurik.com Git - wxWidgets.git/commitdiff
fix assert when using owner-drawn menu items with the newest (Vista) SDK
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 26 Jan 2008 01:34:00 +0000 (01:34 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 26 Jan 2008 01:34:00 +0000 (01:34 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51378 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
src/msw/ownerdrw.cpp

index d84184c0eb6ce650ec5cc09f30d19cd137cbf57a..0e5431fe263a63e1c6a3c5173be5d82595fdb9df 100644 (file)
@@ -341,6 +341,7 @@ wxMSW:
 - Fix setting icons when they have non-default (16*16 and 32*32) sizes
 - Fixed wxLocale::GetInfo to use the C locale.
 - Don't enable disabled windows when showing them (Harry McKame).
+- Fix assert when using owner-drawn menu items with the newest (Vista) SDK
 
 wxGTK:
 
index bb11e87a2c2c9f759dc2f3f4994d91640b4da388..cf3cc95bdace1f5360f7f5f76bc71018eb7271e4 100644 (file)
@@ -86,14 +86,36 @@ public:
     }
 
 private:
-    static void DoInitMetrics()
+    static NONCLIENTMETRICS GetNCM()
     {
         WinStruct<NONCLIENTMETRICS> nm;
-        ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &nm, 0);
+        if ( !::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &nm, 0) )
+        {
+#if WINVER >= 0x0600
+            // a new field has been added to NONCLIENTMETRICS under Vista, so
+            // the call to SystemParametersInfo() fails if we use the struct
+            // size incorporating this new value on an older system -- retry
+            // without it
+            nm.cbSize -= sizeof(int);
+            if ( !::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &nm, 0) )
+#endif // WINVER >= 0x0600
+            {
+                // maybe we should initialize the struct with some defaults?
+                wxLogLastError(_T("SystemParametersInfo(SPI_GETNONCLIENTMETRICS)"));
+            }
+        }
+
+        return nm;
+    }
 
+    static void DoInitMetrics()
+    {
         // iMenuHeight is the menu bar height and the menu items are less tall,
         // although I don't know by how much -- below is the value for my system
-        ms_systemMenuHeight = nm.iMenuHeight - 4;
+        ms_systemMenuHeight = GetNCM().iMenuHeight - 4;
+
+        wxASSERT_MSG( ms_systemMenuHeight > 0,
+                        "menu height should be positive" );
 
         if ( ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0,
                                     &ms_alwaysShowCues, 0) == 0 )
@@ -106,10 +128,7 @@ private:
 
     static void DoInitFont()
     {
-        WinStruct<NONCLIENTMETRICS> nm;
-        ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &nm, 0);
-
-        ms_systemMenuFont = new wxFont(wxNativeFontInfo(nm.lfMenuFont));
+        ms_systemMenuFont = new wxFont(wxNativeFontInfo(GetNCM().lfMenuFont));
     }
 
     static wxFont* ms_systemMenuFont;