1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/msw/font.cpp 
   3 // Purpose:     wxFont class 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) wxWidgets team 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 // For compilers that support precompilation, includes "wx.h". 
  21 #include "wx/wxprec.h" 
  34     #include "wx/encinfo.h" 
  37 #include "wx/msw/private.h" 
  39 #include "wx/fontutil.h" 
  40 #include "wx/fontmap.h" 
  42 #include "wx/tokenzr.h" 
  44 #if wxUSE_EXTENDED_RTTI 
  46 wxBEGIN_ENUM( wxFontFamily 
) 
  47     wxENUM_MEMBER( wxDEFAULT 
) 
  48     wxENUM_MEMBER( wxDECORATIVE 
) 
  49     wxENUM_MEMBER( wxROMAN 
) 
  50     wxENUM_MEMBER( wxSCRIPT 
) 
  51     wxENUM_MEMBER( wxSWISS 
) 
  52     wxENUM_MEMBER( wxMODERN 
) 
  53     wxENUM_MEMBER( wxTELETYPE 
) 
  54 wxEND_ENUM( wxFontFamily 
) 
  56 wxBEGIN_ENUM( wxFontStyle 
) 
  57     wxENUM_MEMBER( wxNORMAL 
) 
  58     wxENUM_MEMBER( wxITALIC 
) 
  59     wxENUM_MEMBER( wxSLANT 
) 
  60 wxEND_ENUM( wxFontStyle 
) 
  62 wxBEGIN_ENUM( wxFontWeight 
) 
  63     wxENUM_MEMBER( wxNORMAL 
) 
  64     wxENUM_MEMBER( wxLIGHT 
) 
  65     wxENUM_MEMBER( wxBOLD 
) 
  66 wxEND_ENUM( wxFontWeight 
) 
  68 IMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI(wxFont
, wxGDIObject
,"wx/font.h") 
  70 wxBEGIN_PROPERTIES_TABLE(wxFont
) 
  71     wxPROPERTY( Size
,int, SetPointSize
, GetPointSize
, 12 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  72     wxPROPERTY( Family
, int  , SetFamily
, GetFamily
, (int)wxDEFAULT 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontFamily 
  73     wxPROPERTY( Style
, int , SetStyle
, GetStyle
, (int)wxNORMAL 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontStyle 
  74     wxPROPERTY( Weight
, int , SetWeight
, GetWeight
, (int)wxNORMAL 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontWeight 
  75     wxPROPERTY( Underlined
, bool , SetUnderlined
, GetUnderlined
, false , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  76     wxPROPERTY( Face
, wxString 
, SetFaceName
, GetFaceName
, EMPTY_MACROVALUE 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  77     wxPROPERTY( Encoding
, wxFontEncoding 
, SetEncoding
, GetEncoding
, wxFONTENCODING_DEFAULT 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  78 wxEND_PROPERTIES_TABLE() 
  80 wxCONSTRUCTOR_6( wxFont 
, int , Size 
, int , Family 
, int , Style 
, int , Weight 
, bool , Underlined 
, wxString 
, Face 
) 
  82 wxBEGIN_HANDLERS_TABLE(wxFont
) 
  83 wxEND_HANDLERS_TABLE() 
  86     IMPLEMENT_DYNAMIC_CLASS(wxFont
, wxGDIObject
) 
  90 // ---------------------------------------------------------------------------- 
  92 // ---------------------------------------------------------------------------- 
  94 // the mask used to extract the pitch from LOGFONT::lfPitchAndFamily field 
  95 static const int PITCH_MASK 
= FIXED_PITCH 
| VARIABLE_PITCH
; 
  97 // ---------------------------------------------------------------------------- 
  98 // wxFontRefData - the internal description of the font 
  99 // ---------------------------------------------------------------------------- 
 101 class WXDLLEXPORT wxFontRefData
: public wxGDIRefData
 
 107         Init(-1, wxSize(0,0), false, wxFONTFAMILY_DEFAULT
, wxFONTSTYLE_NORMAL
, 
 108              wxFONTWEIGHT_NORMAL
, false, wxEmptyString
, 
 109              wxFONTENCODING_DEFAULT
); 
 112     wxFontRefData(int size
, 
 113                   const wxSize
& pixelSize
, 
 114                   bool sizeUsingPixels
, 
 119                   const wxString
& faceName
, 
 120                   wxFontEncoding encoding
) 
 122         Init(size
, pixelSize
, sizeUsingPixels
, family
, style
, weight
, 
 123              underlined
, faceName
, encoding
); 
 126     wxFontRefData(const wxNativeFontInfo
& info
, WXHFONT hFont 
= 0) 
 131     wxFontRefData(const wxFontRefData
& data
) : wxGDIRefData() 
 133         if ( data
.m_nativeFontInfoOk 
) 
 135             Init(data
.m_nativeFontInfo
); 
 139             Init(data
.m_pointSize
, data
.m_pixelSize
, data
.m_sizeUsingPixels
, 
 140                  data
.m_family
, data
.m_style
, data
.m_weight
, 
 141                  data
.m_underlined
, data
.m_faceName
, data
.m_encoding
); 
 145     virtual ~wxFontRefData(); 
 148     bool Alloc(wxFont 
*font
); 
 152     // all wxFont accessors 
 153     int GetPointSize() const 
 155         return m_nativeFontInfoOk 
? m_nativeFontInfo
.GetPointSize() 
 159     wxSize 
GetPixelSize() const 
 161         return m_nativeFontInfoOk 
? m_nativeFontInfo
.GetPixelSize() 
 165     bool IsUsingSizeInPixels() const 
 167         return m_nativeFontInfoOk 
? true : m_sizeUsingPixels
; 
 170     int GetFamily() const 
 177         return m_nativeFontInfoOk 
? m_nativeFontInfo
.GetStyle() 
 181     int GetWeight() const 
 183         return m_nativeFontInfoOk 
? m_nativeFontInfo
.GetWeight() 
 187     bool GetUnderlined() const 
 189         return m_nativeFontInfoOk 
? m_nativeFontInfo
.GetUnderlined() 
 193     wxString 
GetFaceName() const 
 196         if ( m_nativeFontInfoOk 
) 
 197             s 
= m_nativeFontInfo
.GetFaceName(); 
 204     wxFontEncoding 
GetEncoding() const 
 206         return m_nativeFontInfoOk 
? m_nativeFontInfo
.GetEncoding() 
 210     WXHFONT 
GetHFONT() const { return m_hFont
; } 
 213     void SetPointSize(int pointSize
) 
 215         if ( m_nativeFontInfoOk 
) 
 217             m_nativeFontInfo
.SetPointSize(pointSize
); 
 221             m_pointSize 
= pointSize
; 
 222             m_sizeUsingPixels 
= false; 
 226     void SetPixelSize(const wxSize
& pixelSize
) 
 228         if ( m_nativeFontInfoOk 
) 
 230             m_nativeFontInfo
.SetPixelSize(pixelSize
); 
 234             m_pixelSize 
= pixelSize
; 
 235             m_sizeUsingPixels 
= true; 
 239     void SetFamily(int family
) 
 244     void SetStyle(int style
) 
 246         if ( m_nativeFontInfoOk 
) 
 247             m_nativeFontInfo
.SetStyle((wxFontStyle
)style
); 
 252     void SetWeight(int weight
) 
 254         if ( m_nativeFontInfoOk 
) 
 255             m_nativeFontInfo
.SetWeight((wxFontWeight
)weight
); 
 260     bool SetFaceName(const wxString
& faceName
) 
 262         if ( m_nativeFontInfoOk 
) 
 263             return m_nativeFontInfo
.SetFaceName(faceName
); 
 265             m_faceName 
= faceName
; 
 269     void SetUnderlined(bool underlined
) 
 271         if ( m_nativeFontInfoOk 
) 
 272             m_nativeFontInfo
.SetUnderlined(underlined
); 
 274             m_underlined 
= underlined
; 
 277     void SetEncoding(wxFontEncoding encoding
) 
 279         if ( m_nativeFontInfoOk 
) 
 280             m_nativeFontInfo
.SetEncoding(encoding
); 
 282             m_encoding 
= encoding
; 
 285     // native font info tests 
 286     bool HasNativeFontInfo() const { return m_nativeFontInfoOk
; } 
 288     const wxNativeFontInfo
& GetNativeFontInfo() const 
 289         { return m_nativeFontInfo
; } 
 292     // common part of all ctors 
 294               const wxSize
& pixelSize
, 
 295               bool sizeUsingPixels
, 
 300               const wxString
& faceName
, 
 301               wxFontEncoding encoding
); 
 303     void Init(const wxNativeFontInfo
& info
, WXHFONT hFont 
= 0); 
 305     // font characterstics 
 308     bool          m_sizeUsingPixels
; 
 314     wxFontEncoding m_encoding
; 
 316     // Windows font handle 
 320     wxNativeFontInfo m_nativeFontInfo
; 
 321     bool             m_nativeFontInfoOk
; 
 324 // ============================================================================ 
 326 // ============================================================================ 
 328 // ---------------------------------------------------------------------------- 
 330 // ---------------------------------------------------------------------------- 
 332 void wxFontRefData::Init(int pointSize
, 
 333                          const wxSize
& pixelSize
, 
 334                          bool sizeUsingPixels
, 
 339                          const wxString
& faceName
, 
 340                          wxFontEncoding encoding
) 
 343     m_pointSize 
= pointSize 
== -1 ? wxNORMAL_FONT
->GetPointSize() : pointSize
; 
 344     m_pixelSize 
= pixelSize
; 
 345     m_sizeUsingPixels 
= sizeUsingPixels
; 
 349     m_underlined 
= underlined
; 
 350     m_faceName 
= faceName
; 
 351     m_encoding 
= encoding
; 
 355     m_nativeFontInfoOk 
= false; 
 358 void wxFontRefData::Init(const wxNativeFontInfo
& info
, WXHFONT hFont
) 
 360     // hFont may be zero, or it be passed in case we really want to 
 361     // use the exact font created in the underlying system 
 362     // (for example where we can't guarantee conversion from HFONT 
 363     // to LOGFONT back to HFONT) 
 366     m_nativeFontInfoOk 
= true; 
 367     m_nativeFontInfo 
= info
; 
 368     // This is the best we can do since we don't have the 
 369     // correct information at this point. 
 373 wxFontRefData::~wxFontRefData() 
 378 bool wxFontRefData::Alloc(wxFont 
*font
) 
 380     if ( !m_nativeFontInfoOk 
) 
 382         wxFillLogFont(&m_nativeFontInfo
.lf
, font
); 
 383         m_nativeFontInfoOk 
= true; 
 386     HFONT hfont 
= ::CreateFontIndirect(&m_nativeFontInfo
.lf
); 
 389         wxLogLastError(wxT("CreateFont")); 
 393     m_hFont 
= (WXHFONT
)hfont
; 
 397 void wxFontRefData::Free() 
 401         if ( !::DeleteObject((HFONT
) m_hFont
) ) 
 403             wxLogLastError(wxT("DeleteObject(font)")); 
 410 // ---------------------------------------------------------------------------- 
 412 // ---------------------------------------------------------------------------- 
 414 void wxNativeFontInfo::Init() 
 418     // we get better font quality if we use this instead of DEFAULT_QUALITY 
 419     // apparently without any drawbacks 
 421     lf
.lfQuality 
= CLEARTYPE_QUALITY
; 
 423     lf
.lfQuality 
= PROOF_QUALITY
; 
 427 int wxNativeFontInfo::GetPointSize() const 
 429     // FIXME: using the screen here results in incorrect font size calculation 
 431     const int ppInch 
= ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY
); 
 433     return (int) (((72.0*(double)abs(lf
.lfHeight
)) / (double) ppInch
) + 0.5); 
 436 wxSize 
wxNativeFontInfo::GetPixelSize() const 
 439     ret
.SetHeight(lf
.lfHeight
); 
 440     ret
.SetWidth(lf
.lfWidth
); 
 444 wxFontStyle 
wxNativeFontInfo::GetStyle() const 
 446     return lf
.lfItalic 
? wxFONTSTYLE_ITALIC 
: wxFONTSTYLE_NORMAL
; 
 449 wxFontWeight 
wxNativeFontInfo::GetWeight() const 
 451     if ( lf
.lfWeight 
<= 300 ) 
 452         return wxFONTWEIGHT_LIGHT
; 
 454     if ( lf
.lfWeight 
>= 600 ) 
 455         return wxFONTWEIGHT_BOLD
; 
 457     return wxFONTWEIGHT_NORMAL
; 
 460 bool wxNativeFontInfo::GetUnderlined() const 
 462     return lf
.lfUnderline 
!= 0; 
 465 wxString 
wxNativeFontInfo::GetFaceName() const 
 467     return lf
.lfFaceName
; 
 470 wxFontFamily 
wxNativeFontInfo::GetFamily() const 
 474     // extract family from pitch-and-family 
 475     switch ( lf
.lfPitchAndFamily 
& ~PITCH_MASK 
) 
 478             family 
= wxFONTFAMILY_ROMAN
; 
 482             wxFAIL_MSG( _T("unknown LOGFONT::lfFamily value") ); 
 486             family 
= wxFONTFAMILY_SWISS
; 
 490             family 
= wxFONTFAMILY_SCRIPT
; 
 494             family 
= wxFONTFAMILY_MODERN
; 
 498             family 
= wxFONTFAMILY_DECORATIVE
; 
 505 wxFontEncoding 
wxNativeFontInfo::GetEncoding() const 
 507     return wxGetFontEncFromCharSet(lf
.lfCharSet
); 
 510 void wxNativeFontInfo::SetPointSize(int pointsize
) 
 512     // FIXME: using the screen here results in incorrect font size calculation 
 514     const int ppInch 
= ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY
); 
 516     lf
.lfHeight 
= -(int)((pointsize
*((double)ppInch
)/72.0) + 0.5); 
 519 void wxNativeFontInfo::SetPixelSize(const wxSize
& pixelSize
) 
 521     lf
.lfHeight 
= pixelSize
.GetHeight(); 
 522     lf
.lfWidth 
= pixelSize
.GetWidth(); 
 526 void wxNativeFontInfo::SetStyle(wxFontStyle style
) 
 531             wxFAIL_MSG( _T("unknown font style") ); 
 534         case wxFONTSTYLE_NORMAL
: 
 538         case wxFONTSTYLE_ITALIC
: 
 539         case wxFONTSTYLE_SLANT
: 
 545 void wxNativeFontInfo::SetWeight(wxFontWeight weight
) 
 550             wxFAIL_MSG( _T("unknown font weight") ); 
 553         case wxFONTWEIGHT_NORMAL
: 
 554             lf
.lfWeight 
= FW_NORMAL
; 
 557         case wxFONTWEIGHT_LIGHT
: 
 558             lf
.lfWeight 
= FW_LIGHT
; 
 561         case wxFONTWEIGHT_BOLD
: 
 562             lf
.lfWeight 
= FW_BOLD
; 
 567 void wxNativeFontInfo::SetUnderlined(bool underlined
) 
 569     lf
.lfUnderline 
= underlined
; 
 572 bool wxNativeFontInfo::SetFaceName(const wxString
& facename
) 
 574     size_t len 
= WXSIZEOF(lf
.lfFaceName
); 
 575     wxStrncpy(lf
.lfFaceName
, facename
, len
); 
 576     lf
.lfFaceName
[len 
- 1] = '\0';    // truncate the face name 
 580 void wxNativeFontInfo::SetFamily(wxFontFamily family
) 
 583     wxArrayString facename
; 
 585     // the list of fonts associated with a family was partially 
 586     // taken from http://www.codestyle.org/css/font-family 
 591             ff_family 
= FF_SCRIPT
; 
 592             facename
.Add(_T("Script")); 
 593             facename
.Add(_T("Brush Script MT")); 
 594             facename
.Add(_T("Comic Sans MS")); 
 595             facename
.Add(_T("Lucida Handwriting")); 
 599             ff_family 
= FF_DECORATIVE
; 
 600             facename
.Add(_T("Old English Text MT")); 
 601             facename
.Add(_T("Comic Sans MS")); 
 602             facename
.Add(_T("Lucida Handwriting")); 
 606             ff_family 
= FF_ROMAN
; 
 607             facename
.Add(_T("Times New Roman")); 
 608             facename
.Add(_T("Georgia")); 
 609             facename
.Add(_T("Garamond")); 
 610             facename
.Add(_T("Bookman Old Style")); 
 611             facename
.Add(_T("Book Antiqua")); 
 616             ff_family 
= FF_MODERN
; 
 617             facename
.Add(_T("Courier New")); 
 618             facename
.Add(_T("Lucida Console")); 
 619             facename
.Add(_T("Andale Mono")); 
 620             facename
.Add(_T("OCR A Extended")); 
 621             facename
.Add(_T("Terminal")); 
 625             ff_family 
= FF_SWISS
; 
 626             facename
.Add(_T("Arial")); 
 627             facename
.Add(_T("Century Gothic")); 
 628             facename
.Add(_T("Lucida Sans Unicode")); 
 629             facename
.Add(_T("Tahoma")); 
 630             facename
.Add(_T("Trebuchet MS")); 
 631             facename
.Add(_T("Verdana")); 
 637             // We want Windows 2000 or later to have new fonts even MS Shell Dlg 
 638             // is returned as default GUI font for compatibility 
 640             ff_family 
= FF_SWISS
; 
 641             if(wxGetOsVersion(&verMaj
) == wxWINDOWS_NT 
&& verMaj 
>= 5) 
 642                 facename
.Add(_T("MS Shell Dlg 2")); 
 644                 facename
.Add(_T("MS Shell Dlg")); 
 647             //     "MS Shell Dlg is a mapping mechanism that enables 
 648             //     U.S. English Microsoft Windows NT, and Microsoft Windows 2000 to 
 649             //     support locales that have characters that are not contained in code 
 650             //     page 1252. It is not a font but a face name for a nonexistent font." 
 654     lf
.lfPitchAndFamily 
= (BYTE
)(DEFAULT_PITCH
) | ff_family
; 
 656     if ( !wxStrlen(lf
.lfFaceName
) ) 
 658         SetFaceName(facename
); 
 662 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding
) 
 664     wxNativeEncodingInfo info
; 
 665     if ( !wxGetNativeFontEncoding(encoding
, &info
) ) 
 668         if ( wxFontMapper::Get()->GetAltForEncoding(encoding
, &info
) ) 
 670             if ( !info
.facename
.empty() ) 
 672                 // if we have this encoding only in some particular facename, use 
 673                 // the facename - it is better to show the correct characters in a 
 674                 // wrong facename than unreadable text in a correct one 
 675                 SetFaceName(info
.facename
); 
 679 #endif // wxUSE_FONTMAP 
 681             // unsupported encoding, replace with the default 
 682             info
.charset 
= DEFAULT_CHARSET
; 
 686     lf
.lfCharSet 
= (BYTE
)info
.charset
; 
 689 bool wxNativeFontInfo::FromString(const wxString
& s
) 
 693     wxStringTokenizer 
tokenizer(s
, _T(";")); 
 696     wxString token 
= tokenizer
.GetNextToken(); 
 697     if ( token 
!= _T('0') ) 
 700     token 
= tokenizer
.GetNextToken(); 
 701     if ( !token
.ToLong(&l
) ) 
 705     token 
= tokenizer
.GetNextToken(); 
 706     if ( !token
.ToLong(&l
) ) 
 710     token 
= tokenizer
.GetNextToken(); 
 711     if ( !token
.ToLong(&l
) ) 
 715     token 
= tokenizer
.GetNextToken(); 
 716     if ( !token
.ToLong(&l
) ) 
 718     lf
.lfOrientation 
= l
; 
 720     token 
= tokenizer
.GetNextToken(); 
 721     if ( !token
.ToLong(&l
) ) 
 725     token 
= tokenizer
.GetNextToken(); 
 726     if ( !token
.ToLong(&l
) ) 
 728     lf
.lfItalic 
= (BYTE
)l
; 
 730     token 
= tokenizer
.GetNextToken(); 
 731     if ( !token
.ToLong(&l
) ) 
 733     lf
.lfUnderline 
= (BYTE
)l
; 
 735     token 
= tokenizer
.GetNextToken(); 
 736     if ( !token
.ToLong(&l
) ) 
 738     lf
.lfStrikeOut 
= (BYTE
)l
; 
 740     token 
= tokenizer
.GetNextToken(); 
 741     if ( !token
.ToLong(&l
) ) 
 743     lf
.lfCharSet 
= (BYTE
)l
; 
 745     token 
= tokenizer
.GetNextToken(); 
 746     if ( !token
.ToLong(&l
) ) 
 748     lf
.lfOutPrecision 
= (BYTE
)l
; 
 750     token 
= tokenizer
.GetNextToken(); 
 751     if ( !token
.ToLong(&l
) ) 
 753     lf
.lfClipPrecision 
= (BYTE
)l
; 
 755     token 
= tokenizer
.GetNextToken(); 
 756     if ( !token
.ToLong(&l
) ) 
 758     lf
.lfQuality 
= (BYTE
)l
; 
 760     token 
= tokenizer
.GetNextToken(); 
 761     if ( !token
.ToLong(&l
) ) 
 763     lf
.lfPitchAndFamily 
= (BYTE
)l
; 
 765     token 
= tokenizer
.GetNextToken(); 
 768     wxStrcpy(lf
.lfFaceName
, token
.c_str()); 
 773 wxString 
wxNativeFontInfo::ToString() const 
 777     s
.Printf(_T("%d;%ld;%ld;%ld;%ld;%ld;%d;%d;%d;%d;%d;%d;%d;%d;%s"), 
 778              0, // version, in case we want to change the format later 
 797 // ---------------------------------------------------------------------------- 
 799 // ---------------------------------------------------------------------------- 
 801 bool wxFont::Create(const wxNativeFontInfo
& info
, WXHFONT hFont
) 
 805     m_refData 
= new wxFontRefData(info
, hFont
); 
 812 wxFont::wxFont(const wxString
& fontdesc
) 
 814     wxNativeFontInfo info
; 
 815     if ( info
.FromString(fontdesc
) ) 
 819 /* Constructor for a font. Note that the real construction is done 
 820  * in wxDC::SetFont, when information is available about scaling etc. 
 822 bool wxFont::DoCreate(int pointSize
, 
 823                       const wxSize
& pixelSize
, 
 824                       bool sizeUsingPixels
, 
 829                       const wxString
& faceName
, 
 830                       wxFontEncoding encoding
) 
 834     // wxDEFAULT is a valid value for the font size too so we must treat it 
 835     // specially here (otherwise the size would be 70 == wxDEFAULT value) 
 836     if ( pointSize 
== wxDEFAULT 
) 
 838         pointSize 
= wxNORMAL_FONT
->GetPointSize(); 
 841     m_refData 
= new wxFontRefData(pointSize
, pixelSize
, sizeUsingPixels
, 
 842                                   family
, style
, weight
, 
 843                                   underlined
, faceName
, encoding
); 
 854 // ---------------------------------------------------------------------------- 
 855 // real implementation 
 856 // ---------------------------------------------------------------------------- 
 858 bool wxFont::RealizeResource() 
 860     if ( GetResourceHandle() ) 
 862         // VZ: the old code returned false in this case, but it doesn't seem 
 863         //     to make sense because the font _was_ created 
 867     return M_FONTDATA
->Alloc(this); 
 870 bool wxFont::FreeResource(bool WXUNUSED(force
)) 
 872     if ( GetResourceHandle() ) 
 882 WXHANDLE 
wxFont::GetResourceHandle() const 
 884     return (WXHANDLE
)GetHFONT(); 
 887 WXHFONT 
wxFont::GetHFONT() const 
 889     return M_FONTDATA 
? M_FONTDATA
->GetHFONT() : 0; 
 892 bool wxFont::IsFree() const 
 894     return M_FONTDATA 
&& (M_FONTDATA
->GetHFONT() == 0); 
 897 void wxFont::Unshare() 
 899     // Don't change shared data 
 902         m_refData 
= new wxFontRefData(); 
 906         wxFontRefData
* ref 
= new wxFontRefData(*M_FONTDATA
); 
 912 // ---------------------------------------------------------------------------- 
 913 // change font attribute: we recreate font when doing it 
 914 // ---------------------------------------------------------------------------- 
 916 void wxFont::SetPointSize(int pointSize
) 
 920     M_FONTDATA
->SetPointSize(pointSize
); 
 925 void wxFont::SetPixelSize(const wxSize
& pixelSize
) 
 929     M_FONTDATA
->SetPixelSize(pixelSize
); 
 934 void wxFont::SetFamily(int family
) 
 938     M_FONTDATA
->SetFamily(family
); 
 943 void wxFont::SetStyle(int style
) 
 947     M_FONTDATA
->SetStyle(style
); 
 952 void wxFont::SetWeight(int weight
) 
 956     M_FONTDATA
->SetWeight(weight
); 
 961 bool wxFont::SetFaceName(const wxString
& faceName
) 
 965     bool refdataok 
= M_FONTDATA
->SetFaceName(faceName
); 
 969     // NB: using win32's GetObject() API on M_FONTDATA->GetHFONT() 
 970     //     to retrieve a LOGFONT and then compare lf.lfFaceName 
 971     //     with given facename is not reliable at all: 
 972     //     Windows copies the facename given to ::CreateFontIndirect() 
 973     //     without any validity check. 
 974     //     Thus we use wxFontBase::SetFaceName to check if facename 
 976     return refdataok 
&& wxFontBase::SetFaceName(faceName
); 
 979 void wxFont::SetUnderlined(bool underlined
) 
 983     M_FONTDATA
->SetUnderlined(underlined
); 
 988 void wxFont::SetEncoding(wxFontEncoding encoding
) 
 992     M_FONTDATA
->SetEncoding(encoding
); 
 997 void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo
& info
) 
1003     *M_FONTDATA 
= wxFontRefData(info
); 
1008 // ---------------------------------------------------------------------------- 
1010 // ---------------------------------------------------------------------------- 
1012 int wxFont::GetPointSize() const 
1014     wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); 
1016     return M_FONTDATA
->GetPointSize(); 
1019 wxSize 
wxFont::GetPixelSize() const 
1021     return M_FONTDATA
->GetPixelSize(); 
1024 bool wxFont::IsUsingSizeInPixels() const 
1026     wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); 
1028     return M_FONTDATA
->IsUsingSizeInPixels(); 
1031 int wxFont::GetFamily() const 
1033     wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); 
1035     return M_FONTDATA
->GetFamily(); 
1038 int wxFont::GetStyle() const 
1040     wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); 
1042     return M_FONTDATA
->GetStyle(); 
1045 int wxFont::GetWeight() const 
1047     wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); 
1049     return M_FONTDATA
->GetWeight(); 
1052 bool wxFont::GetUnderlined() const 
1054     wxCHECK_MSG( Ok(), false, wxT("invalid font") ); 
1056     return M_FONTDATA
->GetUnderlined(); 
1059 wxString 
wxFont::GetFaceName() const 
1061     wxCHECK_MSG( Ok(), wxEmptyString
, wxT("invalid font") ); 
1063     return M_FONTDATA
->GetFaceName(); 
1066 wxFontEncoding 
wxFont::GetEncoding() const 
1068     wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT
, wxT("invalid font") ); 
1070     return M_FONTDATA
->GetEncoding(); 
1073 const wxNativeFontInfo 
*wxFont::GetNativeFontInfo() const 
1075     return M_FONTDATA
->HasNativeFontInfo() ? &(M_FONTDATA
->GetNativeFontInfo()) 
1079 wxString 
wxFont::GetNativeFontInfoDesc() const 
1081     // be sure we have an HFONT associated... 
1082     wxConstCast(this, wxFont
)->RealizeResource(); 
1083     return wxFontBase::GetNativeFontInfoDesc(); 
1086 wxString 
wxFont::GetNativeFontInfoUserDesc() const 
1088     // be sure we have an HFONT associated... 
1089     wxConstCast(this, wxFont
)->RealizeResource(); 
1090     return wxFontBase::GetNativeFontInfoUserDesc(); 
1093 bool wxFont::IsFixedWidth() const 
1095     if ( M_FONTDATA
->HasNativeFontInfo() ) 
1097         // the two low-order bits specify the pitch of the font, the rest is 
1100             (BYTE
)(M_FONTDATA
->GetNativeFontInfo().lf
.lfPitchAndFamily 
& PITCH_MASK
); 
1102         return pitch 
== FIXED_PITCH
; 
1105     return wxFontBase::IsFixedWidth();