From 67c5dabb646bb3d29a670359d30bf0f4b66581b2 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 26 Jan 2008 01:34:00 +0000 Subject: [PATCH] fix assert when using owner-drawn menu items with the newest (Vista) SDK git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51378 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + src/msw/ownerdrw.cpp | 33 ++++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index d84184c0eb..0e5431fe26 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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: diff --git a/src/msw/ownerdrw.cpp b/src/msw/ownerdrw.cpp index bb11e87a2c..cf3cc95bda 100644 --- a/src/msw/ownerdrw.cpp +++ b/src/msw/ownerdrw.cpp @@ -86,14 +86,36 @@ public: } private: - static void DoInitMetrics() + static NONCLIENTMETRICS GetNCM() { WinStruct 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 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; -- 2.45.2