]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ownerdrw.cpp
Better fix
[wxWidgets.git] / src / msw / ownerdrw.cpp
index bb11e87a2c2c9f759dc2f3f4994d91640b4da388..b41cb1734ae4bd757c79c7d4b9e75e8540d63ec8 100644 (file)
@@ -35,6 +35,7 @@
 #include "wx/fontutil.h"
 
 #include "wx/msw/private.h"
+#include "wx/msw/dc.h"
 
 #ifndef SPI_GETKEYBOARDCUES
 #define SPI_GETKEYBOARDCUES 0x100A
@@ -86,14 +87,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 +129,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;