merged wxFont related fix (operator==) and optimization (cache default GUI font)
from 2.2 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9827 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: settings.h
|
||||
// Name: wx/msw/settings.h
|
||||
// Purpose: wxSystemSettings class
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
@@ -16,14 +16,13 @@
|
||||
#pragma interface "settings.h"
|
||||
#endif
|
||||
|
||||
#include "wx/setup.h"
|
||||
#include "wx/colour.h"
|
||||
#include "wx/font.h"
|
||||
|
||||
class WXDLLEXPORT wxSystemSettings : public wxObject
|
||||
{
|
||||
public:
|
||||
inline wxSystemSettings(void) {}
|
||||
wxSystemSettings() { }
|
||||
|
||||
// Get a system colour
|
||||
static wxColour GetSystemColour(int index);
|
||||
|
@@ -411,7 +411,7 @@ public:
|
||||
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
|
||||
|
@@ -128,15 +128,25 @@ wxFont& wxFont::operator=(const wxFont& font)
|
||||
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
|
||||
|
@@ -130,8 +130,12 @@ void wxWindowBase::InitBase()
|
||||
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 =
|
||||
@@ -642,7 +646,7 @@ bool wxWindowBase::SetFont(const wxFont& font)
|
||||
// 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;
|
||||
|
@@ -74,15 +74,7 @@ bool wxPanel::Create(wxWindow *parent, wxWindowID id,
|
||||
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);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@@ -1213,22 +1213,35 @@ wxCoord wxDC::GetCharWidth() const
|
||||
|
||||
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)
|
||||
|
@@ -188,7 +188,6 @@ bool wxDialog::Create(wxWindow *parent,
|
||||
SubclassWin(GetHWND());
|
||||
|
||||
SetWindowText(hwnd, title);
|
||||
SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: settings.cpp
|
||||
// Purpose: wxSettings
|
||||
// Name: msw/settings.cpp
|
||||
// Purpose: wxSystemSettings
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 04/01/98
|
||||
@@ -9,6 +9,14 @@
|
||||
// Licence: wxWindows license
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "settings.h"
|
||||
#endif
|
||||
@@ -32,6 +40,52 @@
|
||||
#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
|
||||
@@ -55,24 +109,41 @@ wxColour wxSystemSettings::GetSystemColour(int index)
|
||||
|
||||
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
|
||||
{
|
||||
return wxNullFont;
|
||||
wxFAIL_MSG( _T("stock font not found") );
|
||||
}
|
||||
|
||||
if ( isDefaultRequested )
|
||||
{
|
||||
// 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
|
||||
|
@@ -342,12 +342,10 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
|
||||
DLGC_WANTTAB | DLGC_WANTMESSAGE;
|
||||
}
|
||||
|
||||
MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL,
|
||||
return MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL,
|
||||
pos.x, pos.y,
|
||||
WidthDefault(size.x), HeightDefault(size.y),
|
||||
msflags, NULL, exStyle);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -2512,6 +2510,8 @@ bool wxWindow::MSWCreate(int id,
|
||||
|
||||
wxAssociateWinWithHandle((HWND) m_hWnd, this);
|
||||
|
||||
SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user