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"
43 #include "wx/sysopt.h"
46 #include "wx/tokenzr.h"
48 #if wxUSE_EXTENDED_RTTI
50 wxBEGIN_ENUM( wxFontFamily
)
51 wxENUM_MEMBER( wxDEFAULT
)
52 wxENUM_MEMBER( wxDECORATIVE
)
53 wxENUM_MEMBER( wxROMAN
)
54 wxENUM_MEMBER( wxSCRIPT
)
55 wxENUM_MEMBER( wxSWISS
)
56 wxENUM_MEMBER( wxMODERN
)
57 wxENUM_MEMBER( wxTELETYPE
)
58 wxEND_ENUM( wxFontFamily
)
60 wxBEGIN_ENUM( wxFontStyle
)
61 wxENUM_MEMBER( wxNORMAL
)
62 wxENUM_MEMBER( wxITALIC
)
63 wxENUM_MEMBER( wxSLANT
)
64 wxEND_ENUM( wxFontStyle
)
66 wxBEGIN_ENUM( wxFontWeight
)
67 wxENUM_MEMBER( wxNORMAL
)
68 wxENUM_MEMBER( wxLIGHT
)
69 wxENUM_MEMBER( wxBOLD
)
70 wxEND_ENUM( wxFontWeight
)
72 IMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI(wxFont
, wxGDIObject
,"wx/font.h")
74 wxBEGIN_PROPERTIES_TABLE(wxFont
)
75 wxPROPERTY( Size
,int, SetPointSize
, GetPointSize
, 12 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
76 wxPROPERTY( Family
, int , SetFamily
, GetFamily
, (int)wxDEFAULT
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontFamily
77 wxPROPERTY( Style
, int , SetStyle
, GetStyle
, (int)wxNORMAL
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontStyle
78 wxPROPERTY( Weight
, int , SetWeight
, GetWeight
, (int)wxNORMAL
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontWeight
79 wxPROPERTY( Underlined
, bool , SetUnderlined
, GetUnderlined
, false , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
80 wxPROPERTY( Face
, wxString
, SetFaceName
, GetFaceName
, EMPTY_MACROVALUE
, 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
81 wxPROPERTY( Encoding
, wxFontEncoding
, SetEncoding
, GetEncoding
, wxFONTENCODING_DEFAULT
, 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
82 wxEND_PROPERTIES_TABLE()
84 wxCONSTRUCTOR_6( wxFont
, int , Size
, int , Family
, int , Style
, int , Weight
, bool , Underlined
, wxString
, Face
)
86 wxBEGIN_HANDLERS_TABLE(wxFont
)
87 wxEND_HANDLERS_TABLE()
90 IMPLEMENT_DYNAMIC_CLASS(wxFont
, wxGDIObject
)
94 // ----------------------------------------------------------------------------
96 // ----------------------------------------------------------------------------
98 // the mask used to extract the pitch from LOGFONT::lfPitchAndFamily field
99 static const int PITCH_MASK
= FIXED_PITCH
| VARIABLE_PITCH
;
101 // ----------------------------------------------------------------------------
102 // wxFontRefData - the internal description of the font
103 // ----------------------------------------------------------------------------
105 class WXDLLEXPORT wxFontRefData
: public wxGDIRefData
111 Init(-1, wxSize(0,0), false, wxFONTFAMILY_DEFAULT
, wxFONTSTYLE_NORMAL
,
112 wxFONTWEIGHT_NORMAL
, false, wxEmptyString
,
113 wxFONTENCODING_DEFAULT
);
116 wxFontRefData(int size
,
117 const wxSize
& pixelSize
,
118 bool sizeUsingPixels
,
123 const wxString
& faceName
,
124 wxFontEncoding encoding
)
126 Init(size
, pixelSize
, sizeUsingPixels
, family
, style
, weight
,
127 underlined
, faceName
, encoding
);
130 wxFontRefData(const wxNativeFontInfo
& info
, WXHFONT hFont
= 0)
135 wxFontRefData(const wxFontRefData
& data
) : wxGDIRefData()
137 if ( data
.m_nativeFontInfoOk
)
139 Init(data
.m_nativeFontInfo
);
143 Init(data
.m_pointSize
, data
.m_pixelSize
, data
.m_sizeUsingPixels
,
144 data
.m_family
, data
.m_style
, data
.m_weight
,
145 data
.m_underlined
, data
.m_faceName
, data
.m_encoding
);
149 virtual ~wxFontRefData();
152 bool Alloc(const wxFont
*font
);
156 // all wxFont accessors
157 int GetPointSize() const
159 return m_nativeFontInfoOk
? m_nativeFontInfo
.GetPointSize()
163 wxSize
GetPixelSize() const
165 return m_nativeFontInfoOk
? m_nativeFontInfo
.GetPixelSize()
169 bool IsUsingSizeInPixels() const
171 return m_nativeFontInfoOk
? true : m_sizeUsingPixels
;
174 wxFontFamily
GetFamily() const
179 wxFontStyle
GetStyle() const
181 return m_nativeFontInfoOk
? m_nativeFontInfo
.GetStyle()
185 wxFontWeight
GetWeight() const
187 return m_nativeFontInfoOk
? m_nativeFontInfo
.GetWeight()
191 bool GetUnderlined() const
193 return m_nativeFontInfoOk
? m_nativeFontInfo
.GetUnderlined()
197 wxString
GetFaceName() const
200 if ( m_nativeFontInfoOk
)
201 s
= m_nativeFontInfo
.GetFaceName();
208 wxFontEncoding
GetEncoding() const
210 return m_nativeFontInfoOk
? m_nativeFontInfo
.GetEncoding()
214 WXHFONT
GetHFONT(const wxFont
*font
) const
217 const_cast<wxFontRefData
*>(this)->Alloc(font
);
219 return (WXHFONT
)m_hFont
;
222 bool HasHFONT() const
227 // ... and setters: notice that all of them invalidate the currently
228 // allocated HFONT, if any, so that the next call to GetHFONT() recreates a
230 void SetPointSize(int pointSize
)
234 if ( m_nativeFontInfoOk
)
236 m_nativeFontInfo
.SetPointSize(pointSize
);
240 m_pointSize
= pointSize
;
241 m_sizeUsingPixels
= false;
245 void SetPixelSize(const wxSize
& pixelSize
)
249 if ( m_nativeFontInfoOk
)
251 m_nativeFontInfo
.SetPixelSize(pixelSize
);
255 m_pixelSize
= pixelSize
;
256 m_sizeUsingPixels
= true;
260 void SetFamily(wxFontFamily family
)
267 void SetStyle(wxFontStyle style
)
271 if ( m_nativeFontInfoOk
)
272 m_nativeFontInfo
.SetStyle((wxFontStyle
)style
);
277 void SetWeight(wxFontWeight weight
)
281 if ( m_nativeFontInfoOk
)
282 m_nativeFontInfo
.SetWeight((wxFontWeight
)weight
);
287 bool SetFaceName(const wxString
& faceName
)
291 if ( m_nativeFontInfoOk
)
292 return m_nativeFontInfo
.SetFaceName(faceName
);
294 m_faceName
= faceName
;
298 void SetUnderlined(bool underlined
)
302 if ( m_nativeFontInfoOk
)
303 m_nativeFontInfo
.SetUnderlined(underlined
);
305 m_underlined
= underlined
;
308 void SetEncoding(wxFontEncoding encoding
)
312 if ( m_nativeFontInfoOk
)
313 m_nativeFontInfo
.SetEncoding(encoding
);
315 m_encoding
= encoding
;
319 bool HasNativeFontInfo() const { return m_nativeFontInfoOk
; }
321 const wxNativeFontInfo
& GetNativeFontInfo() const
322 { return m_nativeFontInfo
; }
324 void SetNativeFontInfo(const wxNativeFontInfo
& nativeFontInfo
)
328 m_nativeFontInfo
= nativeFontInfo
;
329 m_nativeFontInfoOk
= true;
333 // common part of all ctors
335 const wxSize
& pixelSize
,
336 bool sizeUsingPixels
,
341 const wxString
& faceName
,
342 wxFontEncoding encoding
);
344 void Init(const wxNativeFontInfo
& info
, WXHFONT hFont
= 0);
346 // font characteristics
349 bool m_sizeUsingPixels
;
350 wxFontFamily m_family
;
352 wxFontWeight m_weight
;
355 wxFontEncoding m_encoding
;
357 // Windows font handle, created on demand in GetHFONT()
361 wxNativeFontInfo m_nativeFontInfo
;
362 bool m_nativeFontInfoOk
;
365 #define M_FONTDATA ((wxFontRefData*)m_refData)
367 // ============================================================================
369 // ============================================================================
371 // ----------------------------------------------------------------------------
373 // ----------------------------------------------------------------------------
375 void wxFontRefData::Init(int pointSize
,
376 const wxSize
& pixelSize
,
377 bool sizeUsingPixels
,
382 const wxString
& faceName
,
383 wxFontEncoding encoding
)
386 m_pointSize
= pointSize
== -1 ? wxNORMAL_FONT
->GetPointSize() : pointSize
;
387 m_pixelSize
= pixelSize
;
388 m_sizeUsingPixels
= sizeUsingPixels
;
392 m_underlined
= underlined
;
393 m_faceName
= faceName
;
394 m_encoding
= encoding
;
398 m_nativeFontInfoOk
= false;
401 void wxFontRefData::Init(const wxNativeFontInfo
& info
, WXHFONT hFont
)
403 // hFont may be zero, or it be passed in case we really want to
404 // use the exact font created in the underlying system
405 // (for example where we can't guarantee conversion from HFONT
406 // to LOGFONT back to HFONT)
407 m_hFont
= (HFONT
)hFont
;
409 m_nativeFontInfoOk
= true;
410 m_nativeFontInfo
= info
;
412 // This is the best we can do since we don't have the
413 // correct information at this point.
414 m_family
= wxFONTFAMILY_SWISS
;
417 wxFontRefData::~wxFontRefData()
422 bool wxFontRefData::Alloc(const wxFont
*font
)
424 if ( !m_nativeFontInfoOk
)
426 // NOTE: we use wxNativeInfo::InitFromFont to avoid code duplication:
427 // it results in using our m_* variables (except for m_hFont and
428 // for m_nativeFontInfo obviously) for the initialization
429 // of the wxNativeInfo::lf member.
430 m_nativeFontInfo
.InitFromFont(*font
);
431 m_nativeFontInfoOk
= true;
434 m_hFont
= ::CreateFontIndirect(&m_nativeFontInfo
.lf
);
437 wxLogLastError(wxT("CreateFont"));
444 void wxFontRefData::Free()
448 if ( !::DeleteObject(m_hFont
) )
450 wxLogLastError(wxT("DeleteObject(font)"));
457 // ----------------------------------------------------------------------------
459 // ----------------------------------------------------------------------------
461 void wxNativeFontInfo::Init()
465 // we get better font quality if we use PROOF_QUALITY instead of
466 // DEFAULT_QUALITY but some fonts (e.g. "Terminal 6pt") are not available
467 // then so we allow to set a global option to choose between quality and
468 // wider font selection
470 lf
.lfQuality
= CLEARTYPE_QUALITY
;
472 lf
.lfQuality
= wxSystemOptions::GetOptionInt(_T("msw.font.no-proof-quality"))
478 int wxNativeFontInfo::GetPointSize() const
480 // FIXME: using the screen here results in incorrect font size calculation
482 const int ppInch
= ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY
);
484 // BC++ 2007 doesn't provide abs(long) overload, hence the cast
485 return (int) (((72.0*abs((int)lf
.lfHeight
)) / (double) ppInch
) + 0.5);
488 wxSize
wxNativeFontInfo::GetPixelSize() const
491 ret
.SetHeight(abs((int)lf
.lfHeight
));
492 ret
.SetWidth(lf
.lfWidth
);
496 wxFontStyle
wxNativeFontInfo::GetStyle() const
498 return lf
.lfItalic
? wxFONTSTYLE_ITALIC
: wxFONTSTYLE_NORMAL
;
501 wxFontWeight
wxNativeFontInfo::GetWeight() const
503 if ( lf
.lfWeight
<= 300 )
504 return wxFONTWEIGHT_LIGHT
;
506 if ( lf
.lfWeight
>= 600 )
507 return wxFONTWEIGHT_BOLD
;
509 return wxFONTWEIGHT_NORMAL
;
512 bool wxNativeFontInfo::GetUnderlined() const
514 return lf
.lfUnderline
!= 0;
517 wxString
wxNativeFontInfo::GetFaceName() const
519 return lf
.lfFaceName
;
522 wxFontFamily
wxNativeFontInfo::GetFamily() const
526 // extract family from pitch-and-family
527 switch ( lf
.lfPitchAndFamily
& ~PITCH_MASK
)
530 family
= wxFONTFAMILY_ROMAN
;
534 wxFAIL_MSG( _T("unknown LOGFONT::lfFamily value") );
538 family
= wxFONTFAMILY_SWISS
;
542 family
= wxFONTFAMILY_SCRIPT
;
546 family
= wxFONTFAMILY_MODERN
;
550 family
= wxFONTFAMILY_DECORATIVE
;
557 wxFontEncoding
wxNativeFontInfo::GetEncoding() const
559 return wxGetFontEncFromCharSet(lf
.lfCharSet
);
562 void wxNativeFontInfo::SetPointSize(int pointsize
)
564 // FIXME: using the screen here results in incorrect font size calculation
566 const int ppInch
= ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY
);
568 lf
.lfHeight
= -(int)((pointsize
*((double)ppInch
)/72.0) + 0.5);
571 void wxNativeFontInfo::SetPixelSize(const wxSize
& pixelSize
)
573 // NOTE: although the MSW port allows for negative pixel size heights,
574 // other ports don't and since it's a very useful feature assert
575 // here if we get a negative height:
576 wxCHECK_RET( pixelSize
.GetWidth() >= 0 && pixelSize
.GetHeight() > 0,
577 "Negative values for the pixel size or zero pixel height are not allowed" );
579 lf
.lfHeight
= pixelSize
.GetHeight();
580 lf
.lfWidth
= pixelSize
.GetWidth();
583 void wxNativeFontInfo::SetStyle(wxFontStyle style
)
588 wxFAIL_MSG( _T("unknown font style") );
591 case wxFONTSTYLE_NORMAL
:
595 case wxFONTSTYLE_ITALIC
:
596 case wxFONTSTYLE_SLANT
:
602 void wxNativeFontInfo::SetWeight(wxFontWeight weight
)
607 wxFAIL_MSG( _T("unknown font weight") );
610 case wxFONTWEIGHT_NORMAL
:
611 lf
.lfWeight
= FW_NORMAL
;
614 case wxFONTWEIGHT_LIGHT
:
615 lf
.lfWeight
= FW_LIGHT
;
618 case wxFONTWEIGHT_BOLD
:
619 lf
.lfWeight
= FW_BOLD
;
624 void wxNativeFontInfo::SetUnderlined(bool underlined
)
626 lf
.lfUnderline
= underlined
;
629 bool wxNativeFontInfo::SetFaceName(const wxString
& facename
)
631 wxStrlcpy(lf
.lfFaceName
, facename
.c_str(), WXSIZEOF(lf
.lfFaceName
));
635 void wxNativeFontInfo::SetFamily(wxFontFamily family
)
638 wxArrayString facename
;
640 // the list of fonts associated with a family was partially
641 // taken from http://www.codestyle.org/css/font-family
646 ff_family
= FF_SCRIPT
;
647 facename
.Add(_T("Script"));
648 facename
.Add(_T("Brush Script MT"));
649 facename
.Add(_T("Comic Sans MS"));
650 facename
.Add(_T("Lucida Handwriting"));
654 ff_family
= FF_DECORATIVE
;
655 facename
.Add(_T("Old English Text MT"));
656 facename
.Add(_T("Comic Sans MS"));
657 facename
.Add(_T("Lucida Handwriting"));
661 ff_family
= FF_ROMAN
;
662 facename
.Add(_T("Times New Roman"));
663 facename
.Add(_T("Georgia"));
664 facename
.Add(_T("Garamond"));
665 facename
.Add(_T("Bookman Old Style"));
666 facename
.Add(_T("Book Antiqua"));
671 ff_family
= FF_MODERN
;
672 facename
.Add(_T("Courier New"));
673 facename
.Add(_T("Lucida Console"));
674 facename
.Add(_T("Andale Mono"));
675 facename
.Add(_T("OCR A Extended"));
676 facename
.Add(_T("Terminal"));
680 ff_family
= FF_SWISS
;
681 facename
.Add(_T("Arial"));
682 facename
.Add(_T("Century Gothic"));
683 facename
.Add(_T("Lucida Sans Unicode"));
684 facename
.Add(_T("Tahoma"));
685 facename
.Add(_T("Trebuchet MS"));
686 facename
.Add(_T("Verdana"));
692 // We want Windows 2000 or later to have new fonts even MS Shell Dlg
693 // is returned as default GUI font for compatibility
695 ff_family
= FF_SWISS
;
696 if(wxGetOsVersion(&verMaj
) == wxOS_WINDOWS_NT
&& verMaj
>= 5)
697 facename
.Add(_T("MS Shell Dlg 2"));
699 facename
.Add(_T("MS Shell Dlg"));
702 // "MS Shell Dlg is a mapping mechanism that enables
703 // U.S. English Microsoft Windows NT, and Microsoft Windows 2000 to
704 // support locales that have characters that are not contained in code
705 // page 1252. It is not a font but a face name for a nonexistent font."
709 lf
.lfPitchAndFamily
= (BYTE
)(DEFAULT_PITCH
) | ff_family
;
711 if ( !wxStrlen(lf
.lfFaceName
) )
713 SetFaceName(facename
);
717 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding
)
719 wxNativeEncodingInfo info
;
720 if ( !wxGetNativeFontEncoding(encoding
, &info
) )
723 if ( wxFontMapper::Get()->GetAltForEncoding(encoding
, &info
) )
725 if ( !info
.facename
.empty() )
727 // if we have this encoding only in some particular facename, use
728 // the facename - it is better to show the correct characters in a
729 // wrong facename than unreadable text in a correct one
730 SetFaceName(info
.facename
);
734 #endif // wxUSE_FONTMAP
736 // unsupported encoding, replace with the default
737 info
.charset
= DEFAULT_CHARSET
;
741 lf
.lfCharSet
= (BYTE
)info
.charset
;
744 bool wxNativeFontInfo::FromString(const wxString
& s
)
748 wxStringTokenizer
tokenizer(s
, _T(";"));
751 wxString token
= tokenizer
.GetNextToken();
752 if ( token
!= _T('0') )
755 token
= tokenizer
.GetNextToken();
756 if ( !token
.ToLong(&l
) )
760 token
= tokenizer
.GetNextToken();
761 if ( !token
.ToLong(&l
) )
765 token
= tokenizer
.GetNextToken();
766 if ( !token
.ToLong(&l
) )
770 token
= tokenizer
.GetNextToken();
771 if ( !token
.ToLong(&l
) )
773 lf
.lfOrientation
= l
;
775 token
= tokenizer
.GetNextToken();
776 if ( !token
.ToLong(&l
) )
780 token
= tokenizer
.GetNextToken();
781 if ( !token
.ToLong(&l
) )
783 lf
.lfItalic
= (BYTE
)l
;
785 token
= tokenizer
.GetNextToken();
786 if ( !token
.ToLong(&l
) )
788 lf
.lfUnderline
= (BYTE
)l
;
790 token
= tokenizer
.GetNextToken();
791 if ( !token
.ToLong(&l
) )
793 lf
.lfStrikeOut
= (BYTE
)l
;
795 token
= tokenizer
.GetNextToken();
796 if ( !token
.ToLong(&l
) )
798 lf
.lfCharSet
= (BYTE
)l
;
800 token
= tokenizer
.GetNextToken();
801 if ( !token
.ToLong(&l
) )
803 lf
.lfOutPrecision
= (BYTE
)l
;
805 token
= tokenizer
.GetNextToken();
806 if ( !token
.ToLong(&l
) )
808 lf
.lfClipPrecision
= (BYTE
)l
;
810 token
= tokenizer
.GetNextToken();
811 if ( !token
.ToLong(&l
) )
813 lf
.lfQuality
= (BYTE
)l
;
815 token
= tokenizer
.GetNextToken();
816 if ( !token
.ToLong(&l
) )
818 lf
.lfPitchAndFamily
= (BYTE
)l
;
820 token
= tokenizer
.GetNextToken();
823 wxStrcpy(lf
.lfFaceName
, token
.c_str());
828 wxString
wxNativeFontInfo::ToString() const
832 s
.Printf(_T("%d;%ld;%ld;%ld;%ld;%ld;%d;%d;%d;%d;%d;%d;%d;%d;%s"),
833 0, // version, in case we want to change the format later
847 (const wxChar
*)lf
.lfFaceName
);
852 // ----------------------------------------------------------------------------
854 // ----------------------------------------------------------------------------
856 wxFont::wxFont(const wxString
& fontdesc
)
858 wxNativeFontInfo info
;
859 if ( info
.FromString(fontdesc
) )
863 bool wxFont::Create(const wxNativeFontInfo
& info
, WXHFONT hFont
)
867 m_refData
= new wxFontRefData(info
, hFont
);
869 return RealizeResource();
872 bool wxFont::DoCreate(int pointSize
,
873 const wxSize
& pixelSize
,
874 bool sizeUsingPixels
,
879 const wxString
& faceName
,
880 wxFontEncoding encoding
)
884 // wxDEFAULT is a valid value for the font size too so we must treat it
885 // specially here (otherwise the size would be 70 == wxDEFAULT value)
886 if ( pointSize
== wxDEFAULT
)
888 pointSize
= wxNORMAL_FONT
->GetPointSize();
891 m_refData
= new wxFontRefData(pointSize
, pixelSize
, sizeUsingPixels
,
892 family
, style
, weight
,
893 underlined
, faceName
, encoding
);
895 return RealizeResource();
902 // ----------------------------------------------------------------------------
903 // real implementation
904 // ----------------------------------------------------------------------------
906 wxGDIRefData
*wxFont::CreateGDIRefData() const
908 return new wxFontRefData();
911 wxGDIRefData
*wxFont::CloneGDIRefData(const wxGDIRefData
*data
) const
913 return new wxFontRefData(*static_cast<const wxFontRefData
*>(data
));
916 bool wxFont::RealizeResource()
918 // NOTE: the GetHFONT() call automatically triggers a reallocation of
919 // the HFONT if necessary (will do nothing if we already have the resource);
920 // it returns NULL only if there is a failure in wxFontRefData::Alloc()...
921 return GetHFONT() != NULL
;
924 bool wxFont::FreeResource(bool WXUNUSED(force
))
934 WXHANDLE
wxFont::GetResourceHandle() const
936 return (WXHANDLE
)GetHFONT();
939 WXHFONT
wxFont::GetHFONT() const
941 // NOTE: wxFontRefData::GetHFONT() will automatically call
942 // wxFontRefData::Alloc() if necessary
943 return M_FONTDATA
? M_FONTDATA
->GetHFONT(this) : 0;
946 bool wxFont::IsFree() const
948 return M_FONTDATA
&& !M_FONTDATA
->HasHFONT();
951 // ----------------------------------------------------------------------------
952 // change font attribute: we recreate font when doing it
953 // ----------------------------------------------------------------------------
955 void wxFont::SetPointSize(int pointSize
)
960 M_FONTDATA
->SetPointSize(pointSize
);
963 void wxFont::SetPixelSize(const wxSize
& pixelSize
)
967 M_FONTDATA
->SetPixelSize(pixelSize
);
970 void wxFont::SetFamily(wxFontFamily family
)
974 M_FONTDATA
->SetFamily(family
);
977 void wxFont::SetStyle(wxFontStyle style
)
981 M_FONTDATA
->SetStyle(style
);
984 void wxFont::SetWeight(wxFontWeight weight
)
988 M_FONTDATA
->SetWeight(weight
);
991 bool wxFont::SetFaceName(const wxString
& faceName
)
995 if ( !M_FONTDATA
->SetFaceName(faceName
) )
998 // NB: using win32's GetObject() API on M_FONTDATA->GetHFONT()
999 // to retrieve a LOGFONT and then compare lf.lfFaceName
1000 // with given facename is not reliable at all:
1001 // Windows copies the facename given to ::CreateFontIndirect()
1002 // without any validity check.
1003 // Thus we use wxFontBase::SetFaceName to check if facename
1005 return wxFontBase::SetFaceName(faceName
);
1008 void wxFont::SetUnderlined(bool underlined
)
1012 M_FONTDATA
->SetUnderlined(underlined
);
1015 void wxFont::SetEncoding(wxFontEncoding encoding
)
1019 M_FONTDATA
->SetEncoding(encoding
);
1022 void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo
& info
)
1026 M_FONTDATA
->SetNativeFontInfo(info
);
1029 // ----------------------------------------------------------------------------
1031 // ----------------------------------------------------------------------------
1033 int wxFont::GetPointSize() const
1035 wxCHECK_MSG( IsOk(), 0, wxT("invalid font") );
1037 return M_FONTDATA
->GetPointSize();
1040 wxSize
wxFont::GetPixelSize() const
1042 wxCHECK_MSG( IsOk(), wxDefaultSize
, wxT("invalid font") );
1044 return M_FONTDATA
->GetPixelSize();
1047 bool wxFont::IsUsingSizeInPixels() const
1049 wxCHECK_MSG( IsOk(), 0, wxT("invalid font") );
1051 return M_FONTDATA
->IsUsingSizeInPixels();
1054 wxFontFamily
wxFont::GetFamily() const
1056 wxCHECK_MSG( IsOk(), wxFONTFAMILY_MAX
, wxT("invalid font") );
1058 return M_FONTDATA
->GetFamily();
1061 wxFontStyle
wxFont::GetStyle() const
1063 wxCHECK_MSG( IsOk(), wxFONTSTYLE_MAX
, wxT("invalid font") );
1065 return M_FONTDATA
->GetStyle();
1068 wxFontWeight
wxFont::GetWeight() const
1070 wxCHECK_MSG( IsOk(), wxFONTWEIGHT_MAX
, wxT("invalid font") );
1072 return M_FONTDATA
->GetWeight();
1075 bool wxFont::GetUnderlined() const
1077 wxCHECK_MSG( IsOk(), false, wxT("invalid font") );
1079 return M_FONTDATA
->GetUnderlined();
1082 wxString
wxFont::GetFaceName() const
1084 wxCHECK_MSG( IsOk(), wxEmptyString
, wxT("invalid font") );
1086 return M_FONTDATA
->GetFaceName();
1089 wxFontEncoding
wxFont::GetEncoding() const
1091 wxCHECK_MSG( IsOk(), wxFONTENCODING_DEFAULT
, wxT("invalid font") );
1093 return M_FONTDATA
->GetEncoding();
1096 const wxNativeFontInfo
*wxFont::GetNativeFontInfo() const
1098 return IsOk() && M_FONTDATA
->HasNativeFontInfo() ? &(M_FONTDATA
->GetNativeFontInfo())
1102 wxString
wxFont::GetNativeFontInfoDesc() const
1104 wxCHECK_MSG( IsOk(), wxEmptyString
, wxT("invalid font") );
1106 // be sure we have an HFONT associated...
1107 const_cast<wxFont
*>(this)->RealizeResource();
1108 return wxFontBase::GetNativeFontInfoDesc();
1111 wxString
wxFont::GetNativeFontInfoUserDesc() const
1113 wxCHECK_MSG( IsOk(), wxEmptyString
, wxT("invalid font") );
1115 // be sure we have an HFONT associated...
1116 const_cast<wxFont
*>(this)->RealizeResource();
1117 return wxFontBase::GetNativeFontInfoUserDesc();
1120 bool wxFont::IsFixedWidth() const
1122 wxCHECK_MSG( IsOk(), false, wxT("invalid font") );
1124 if ( M_FONTDATA
->HasNativeFontInfo() )
1126 // the two low-order bits specify the pitch of the font, the rest is
1129 (BYTE
)(M_FONTDATA
->GetNativeFontInfo().lf
.lfPitchAndFamily
& PITCH_MASK
);
1131 return pitch
== FIXED_PITCH
;
1134 return wxFontBase::IsFixedWidth();