/////////////////////////////////////////////////////////////////////////////
-// Name: settings.h
+// Name: wx/msw/settings.h
// Purpose: wxSystemSettings class
// Author: Julian Smart
// Modified by:
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_SETTINGS_H_
#pragma interface "settings.h"
#endif
-#include "wx/setup.h"
#include "wx/colour.h"
#include "wx/font.h"
-class WXDLLEXPORT wxSystemSettings: public wxObject
+class WXDLLEXPORT wxSystemSettings : public wxObject
{
public:
- inline wxSystemSettings(void) {}
+ wxSystemSettings() { }
// Get a system colour
- static wxColour GetSystemColour(int index);
+ static wxColour GetSystemColour(int index);
// Get a system font
- static wxFont GetSystemFont(int index);
+ static wxFont GetSystemFont(int index);
// Get a system metric, e.g. scrollbar size
- static int GetSystemMetric(int index);
+ static int GetSystemMetric(int index);
};
#endif
virtual void DoToolbarUpdates();
// Don't want toolbars to accept the focus
- bool AcceptsFocus() const { return FALSE; }
+ virtual bool AcceptsFocus() const { return FALSE; }
protected:
// to implement in derived classes
return (wxFont &)*this;
}
-// VZ: is it correct to compare pointers and not the contents? (FIXME)
bool wxFontBase::operator==(const wxFont& font) const
{
- return GetFontData() == font.GetFontData();
+ // either it is the same font, i.e. they share the same common data or they
+ // have different ref datas but still describe the same font
+ return GetFontData() == font.GetFontData() ||
+ (
+ Ok() == font.Ok() &&
+ GetPointSize() == font.GetPointSize() &&
+ GetFamily() == font.GetFamily() &&
+ GetStyle() == font.GetStyle() &&
+ GetUnderlined() == font.GetUnderlined() &&
+ GetFaceName() == font.GetFaceName() &&
+ GetEncoding() == font.GetEncoding()
+ );
}
bool wxFontBase::operator!=(const wxFont& font) const
{
- return GetFontData() != font.GetFontData();
+ return !(*this == font);
}
wxString wxFontBase::GetFamilyString() const
m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE);
m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT);
- // GRG, changed Mar/2000
+ // don't set the font here for wxMSW as we don't call WM_SETFONT here and
+ // so the font is *not* really set - but calls to SetFont() later won't do
+ // anything because m_font appears to be already set!
+#ifndef __WXMSW__
m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+#endif // __WXMSW__
// no style bits
m_exStyle =
// don't try to set invalid font, always fall back to the default
const wxFont& fontOk = font.Ok() ? font : *wxSWISS_FONT;
- if ( (wxFont&)fontOk == m_font )
+ if ( fontOk == m_font )
{
// no change
return FALSE;
long style,
const wxString& name)
{
- bool ret = wxWindow::Create(parent, id, pos, size, style, name);
-
- if ( ret )
- {
- SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
- SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
- }
-
- return ret;
+ return wxWindow::Create(parent, id, pos, size, style, name);
}
// ----------------------------------------------------------------------------
void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y,
wxCoord *descent, wxCoord *externalLeading,
- wxFont *theFont) const
+ wxFont *font) const
{
- wxFont *fontToUse = (wxFont*) theFont;
- if (!fontToUse)
- fontToUse = (wxFont*) &m_font;
+ HFONT hfontOld;
+ if ( font )
+ {
+ wxASSERT_MSG( font->Ok(), _T("invalid font in wxDC::GetTextExtent") );
+
+ hfontOld = (HFONT)::SelectObject(GetHdc(), GetHfontOf(*font));
+ }
+ else // don't change the font
+ {
+ hfontOld = 0;
+ }
SIZE sizeRect;
TEXTMETRIC tm;
- GetTextExtentPoint(GetHdc(), WXSTRINGCAST string, wxStrlen(WXSTRINGCAST string), &sizeRect);
+ GetTextExtentPoint(GetHdc(), string, string.length(), &sizeRect);
GetTextMetrics(GetHdc(), &tm);
if (x) *x = XDEV2LOGREL(sizeRect.cx);
if (y) *y = YDEV2LOGREL(sizeRect.cy);
if (descent) *descent = tm.tmDescent;
if (externalLeading) *externalLeading = tm.tmExternalLeading;
+
+ if ( hfontOld )
+ {
+ ::SelectObject(GetHdc(), hfontOld);
+ }
}
void wxDC::SetMapMode(int mode)
SubclassWin(GetHWND());
SetWindowText(hwnd, title);
- SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
-// Name: settings.cpp
-// Purpose: wxSettings
+// Name: msw/settings.cpp
+// Purpose: wxSystemSettings
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
#ifdef __GNUG__
-#pragma implementation "settings.h"
+ #pragma implementation "settings.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#endif
#ifndef WX_PRECOMP
-#include <stdio.h>
-#include "wx/defs.h"
-#include "wx/pen.h"
-#include "wx/brush.h"
-#include "wx/gdicmn.h"
+ #include <stdio.h>
+ #include "wx/defs.h"
+ #include "wx/pen.h"
+ #include "wx/brush.h"
+ #include "wx/gdicmn.h"
#endif
#include "wx/settings.h"
#include "wx/window.h"
#include "wx/msw/private.h"
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+// the module which is used to clean up wxSystemSettings data (this is a
+// singleton class so it can't be done in the dtor)
+class wxSystemSettingsModule : public wxModule
+{
+public:
+ virtual bool OnInit();
+ virtual void OnExit();
+
+private:
+ DECLARE_DYNAMIC_CLASS(wxSystemSettingsModule)
+};
+
+// ----------------------------------------------------------------------------
+// global data
+// ----------------------------------------------------------------------------
+
+static wxFont *gs_fontDefault = NULL;
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxSystemSettingsModule
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxSystemSettingsModule, wxModule)
+
+bool wxSystemSettingsModule::OnInit()
+{
+ return TRUE;
+}
+
+void wxSystemSettingsModule::OnExit()
+{
+ delete gs_fontDefault;
+}
+
+// ----------------------------------------------------------------------------
+// wxSystemSettings
+// ----------------------------------------------------------------------------
+
// TODO: see ::SystemParametersInfo for all sorts of Windows settings.
// Different args are required depending on the id. How does this differ
// from GetSystemMetric, and should it? Perhaps call it GetSystemParameter
{
case wxSYS_COLOUR_LISTBOX:
return *wxWHITE;
-
+
default:
COLORREF ref = ::GetSysColor(index);
wxColour col(GetRValue(ref), GetGValue(ref), GetBValue(ref));
wxFont wxSystemSettings::GetSystemFont(int index)
{
+ // wxWindow ctor calls GetSystemFont(wxSYS_DEFAULT_GUI_FONT) so we're
+ // called fairly often - this is why we cache this particular font
+ bool isDefaultRequested = index == wxSYS_DEFAULT_GUI_FONT;
+ if ( isDefaultRequested && gs_fontDefault )
+ {
+ return *gs_fontDefault;
+ }
+
+ wxFont font;
+
HFONT hFont = (HFONT) ::GetStockObject(index);
- if ( hFont != (HFONT) NULL )
+ if ( hFont )
{
LOGFONT lf;
if ( ::GetObject(hFont, sizeof(LOGFONT), &lf) != 0 )
{
- // In fontdlg.cpp
- return wxCreateFontFromLogFont(&lf);
+ font = wxCreateFontFromLogFont(&lf);
}
else
{
- return wxNullFont;
+ wxFAIL_MSG( _T("failed to get LOGFONT") );
}
}
- else
+ else // GetStockObject() failed
+ {
+ wxFAIL_MSG( _T("stock font not found") );
+ }
+
+ if ( isDefaultRequested )
{
- return wxNullFont;
+ // if we got here it means we hadn't cached it yet - do now
+ gs_fontDefault = new wxFont(font);
}
+
+ return font;
}
// Get a system metric, e.g. scrollbar size
DLGC_WANTTAB | DLGC_WANTMESSAGE;
}
- MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL,
- pos.x, pos.y,
- WidthDefault(size.x), HeightDefault(size.y),
- msflags, NULL, exStyle);
-
- return TRUE;
+ return MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL,
+ pos.x, pos.y,
+ WidthDefault(size.x), HeightDefault(size.y),
+ msflags, NULL, exStyle);
}
// ---------------------------------------------------------------------------
wxAssociateWinWithHandle((HWND) m_hWnd, this);
+ SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+
return TRUE;
}