From e328b9724536b9e4d2e0e89c32d43d726d031c75 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 5 Sep 2008 13:26:45 +0000 Subject: [PATCH] extract wrapper for SystemParametersInfo(SPI_GETNONCLIENTMETRICS) in a header so that it could be reused from elsewhere git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55472 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/private/metrics.h | 49 ++++++++++++++++++++++++++++++++ src/msw/ownerdrw.cpp | 28 +++--------------- 2 files changed, 53 insertions(+), 24 deletions(-) create mode 100644 include/wx/msw/private/metrics.h diff --git a/include/wx/msw/private/metrics.h b/include/wx/msw/private/metrics.h new file mode 100644 index 0000000000..fe9483a3fa --- /dev/null +++ b/include/wx/msw/private/metrics.h @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/private/metrics.h +// Purpose: various helper functions to retrieve system metrics +// Author: Vadim Zeitlin +// Created: 2008-09-05 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_PRIVATE_METRICS_H_ +#define _WX_MSW_PRIVATE_METRICS_H_ + +namespace wxMSWImpl +{ + +// return NONCLIENTMETRICS as retrieved by SystemParametersInfo() +// +// currently this is not cached as the values may change when system settings +// do and we don't react to this to invalidate the cache but it could be done +// in the future +// +// MT-safety: this function is only meant to be called from the main thread +inline const NONCLIENTMETRICS& GetNonClientMetrics() +{ + static WinStruct nm; + 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; +} + +} // namespace wxMSWImpl + +#endif // _WX_MSW_PRIVATE_METRICS_H_ + diff --git a/src/msw/ownerdrw.cpp b/src/msw/ownerdrw.cpp index b41cb1734a..3dfc9d0065 100644 --- a/src/msw/ownerdrw.cpp +++ b/src/msw/ownerdrw.cpp @@ -35,6 +35,7 @@ #include "wx/fontutil.h" #include "wx/msw/private.h" +#include "wx/msw/private/metrics.h" #include "wx/msw/dc.h" #ifndef SPI_GETKEYBOARDCUES @@ -87,33 +88,11 @@ public: } private: - static NONCLIENTMETRICS GetNCM() - { - WinStruct nm; - 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 = GetNCM().iMenuHeight - 4; + ms_systemMenuHeight = wxMSWImpl::GetNonClientMetrics().iMenuHeight - 4; wxASSERT_MSG( ms_systemMenuHeight > 0, "menu height should be positive" ); @@ -129,7 +108,8 @@ private: static void DoInitFont() { - ms_systemMenuFont = new wxFont(wxNativeFontInfo(GetNCM().lfMenuFont)); + ms_systemMenuFont = new + wxFont(wxNativeFontInfo(wxMSWImpl::GetNonClientMetrics().lfMenuFont)); } static wxFont* ms_systemMenuFont; -- 2.47.2