#include "wx/msw/private.h"
-#if !USE_SHARED_LIBRARIES
- IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
+IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
- #if wxUSE_PORTABLE_FONTS_IN_MSW
- IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject)
- #endif
-#endif
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// the default font size in points
+static const int wxDEFAULT_FONT_SIZE = 12;
// ----------------------------------------------------------------------------
// wxFontRefData - the internal description of the font
public:
wxFontRefData()
{
- Init(12, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE,
+ Init(wxDEFAULT_FONT_SIZE, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE,
"", wxFONTENCODING_DEFAULT);
}
{
if ( !::DeleteObject((HFONT) m_hFont) )
{
- wxLogLastError("DeleteObject(font)");
+ wxLogLastError(wxT("DeleteObject(font)"));
}
}
}
wxFontEncoding encoding)
{
UnRef();
+
+ // wxDEFAULT is a valid value for the font size too so we must treat it
+ // specially here (otherwise the size would be 70 == wxDEFAULT value)
+ if ( pointSize == wxDEFAULT )
+ pointSize = wxDEFAULT_FONT_SIZE;
+
m_refData = new wxFontRefData(pointSize, family, style, weight,
underlined, faceName, encoding);
{
// VZ: the old code returned FALSE in this case, but it doesn't seem
// to make sense because the font _was_ created
- wxLogDebug(wxT("Calling wxFont::RealizeResource() twice"));
-
return TRUE;
}
- int ff_family = 0;
- wxString ff_face;
-
- switch ( M_FONTDATA->m_family )
- {
- case wxSCRIPT:
- ff_family = FF_SCRIPT ;
- ff_face = wxT("Script") ;
- break ;
-
- case wxDECORATIVE:
- ff_family = FF_DECORATIVE;
- break;
-
- case wxROMAN:
- ff_family = FF_ROMAN;
- ff_face = wxT("Times New Roman") ;
- break;
-
- case wxTELETYPE:
- case wxMODERN:
- ff_family = FF_MODERN;
- ff_face = wxT("Courier New") ;
- break;
-
- case wxSWISS:
- ff_family = FF_SWISS;
- ff_face = wxT("Arial") ;
- break;
-
- case wxDEFAULT:
- default:
- ff_family = FF_SWISS;
- ff_face = wxT("Arial") ;
- }
-
- BYTE ff_italic;
- switch ( M_FONTDATA->m_style )
+ LOGFONT lf;
+ wxFillLogFont(&lf, this);
+ M_FONTDATA->m_hFont = (WXHFONT)::CreateFontIndirect(&lf);
+ M_FONTDATA->m_faceName = lf.lfFaceName;
+ if ( !M_FONTDATA->m_hFont )
{
- case wxITALIC:
- case wxSLANT:
- ff_italic = 1;
- break;
-
- default:
- wxFAIL_MSG(wxT("unknown font slant"));
- // fall through
+ wxLogLastError(wxT("CreateFont"));
- case wxNORMAL:
- ff_italic = 0;
+ return FALSE;
}
- int ff_weight = 0;
- switch ( M_FONTDATA->m_weight )
- {
- default:
- wxFAIL_MSG(wxT("unknown font weight"));
- // fall through
-
- case wxNORMAL:
- ff_weight = FW_NORMAL;
- break;
-
- case wxLIGHT:
- ff_weight = FW_LIGHT;
- break;
-
- case wxBOLD:
- ff_weight = FW_BOLD;
- break;
- }
-
- const wxChar* pzFace;
- if ( M_FONTDATA->m_faceName.IsEmpty() )
- pzFace = ff_face;
- else
- pzFace = M_FONTDATA->m_faceName ;
-
-#if 0
- /* Always calculate fonts using the screen DC (is this the best strategy?)
- * There may be confusion if a font is selected into a printer
- * DC (say), because the height will be calculated very differently.
- */
- // What sort of display is it?
- int technology = ::GetDeviceCaps(dc, TECHNOLOGY);
-
- int nHeight;
-
- if (technology != DT_RASDISPLAY && technology != DT_RASPRINTER)
- {
- // Have to get screen DC Caps, because a metafile will return 0.
- HDC dc2 = ::GetDC(NULL);
- nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc2, LOGPIXELSY)/72;
- ::ReleaseDC(NULL, dc2);
- }
- else
- {
- nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc, LOGPIXELSY)/72;
- }
-#endif // 0
-
-#if 0
- // Have to get screen DC Caps, because a metafile will return 0.
- HDC dc2 = ::GetDC(NULL);
- ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY);
- ::ReleaseDC(NULL, dc2);
-#endif // 0
-
- // New behaviour: apparently ppInch varies according to Large/Small Fonts
- // setting in Windows. This messes up fonts. So, set ppInch to a constant
- // 96 dpi.
- static const int ppInch = 96;
-
-#if wxFONT_SIZE_COMPATIBILITY
- // Incorrect, but compatible with old wxWindows behaviour
- int nHeight = (M_FONTDATA->m_pointSize*ppInch/72);
-#else
- // Correct for Windows compatibility
- int nHeight = - (M_FONTDATA->m_pointSize*ppInch/72);
-#endif
-
- BYTE ff_underline = M_FONTDATA->m_underlined;
-
- DWORD charset = wxCharsetFromEncoding(GetEncoding());
- HFONT hFont = ::CreateFont
- (
- nHeight, // height
- 0, // width (choose best)
- 0, // escapement
- 0, // orientation
- ff_weight, // weight
- ff_italic, // italic?
- ff_underline, // underlined?
- 0, // strikeout?
- charset, // charset
- OUT_DEFAULT_PRECIS, // precision
- CLIP_DEFAULT_PRECIS, // clip precision
- PROOF_QUALITY, // quality of match
- DEFAULT_PITCH | // fixed or variable
- ff_family, // family id
- pzFace // face name
- );
-
- M_FONTDATA->m_hFont = (WXHFONT)hFont;
- if ( !hFont )
- {
- wxLogLastError("CreateFont");
- }
-
- return hFont != 0;
+ return TRUE;
}
bool wxFont::FreeResource(bool force)
{
if ( !::DeleteObject((HFONT) M_FONTDATA->m_hFont) )
{
- wxLogLastError("DeleteObject(font)");
+ wxLogLastError(wxT("DeleteObject(font)"));
}
M_FONTDATA->m_hFont = 0;
}
WXHANDLE wxFont::GetResourceHandle()
+{
+ return GetHFONT();
+}
+
+WXHFONT wxFont::GetHFONT() const
{
if ( !M_FONTDATA )
return 0;
else
- return (WXHANDLE)M_FONTDATA->m_hFont ;
+ return (WXHANDLE)M_FONTDATA->m_hFont;
}
bool wxFont::IsFree() const
{
wxString str;
if ( M_FONTDATA )
- str = M_FONTDATA->m_faceName ;
+ str = M_FONTDATA->m_faceName;
return str;
}
return M_FONTDATA->m_encoding;
}
-// ----------------------------------------------------------------------------
-// public functions
-// ----------------------------------------------------------------------------
-
-int wxCharsetFromEncoding(wxFontEncoding encoding, bool *exact)
-{
- if ( encoding == wxFONTENCODING_DEFAULT )
- {
- encoding = wxFont::GetDefaultEncoding();
- }
-
- if ( exact )
- *exact = TRUE;
-
- int charset;
- switch ( encoding )
- {
- case wxFONTENCODING_ISO8859_1:
- case wxFONTENCODING_ISO8859_15:
- case wxFONTENCODING_CP1250:
- charset = ANSI_CHARSET;
- break;
-
-#if !defined(__WIN16__)
- case wxFONTENCODING_ISO8859_2:
- case wxFONTENCODING_CP1252:
- charset = EASTEUROPE_CHARSET;
- break;
-
- case wxFONTENCODING_ISO8859_4:
- case wxFONTENCODING_ISO8859_10:
- charset = BALTIC_CHARSET;
- break;
-
- case wxFONTENCODING_ISO8859_5:
- case wxFONTENCODING_CP1251:
- charset = RUSSIAN_CHARSET;
- break;
-
- case wxFONTENCODING_ISO8859_6:
- charset = ARABIC_CHARSET;
- break;
-
- case wxFONTENCODING_ISO8859_7:
- charset = GREEK_CHARSET;
- break;
-
- case wxFONTENCODING_ISO8859_8:
- charset = HEBREW_CHARSET;
- break;
-
- case wxFONTENCODING_ISO8859_9:
- charset = TURKISH_CHARSET;
- break;
-
- case wxFONTENCODING_ISO8859_11:
- charset = THAI_CHARSET;
- break;
-#endif // BC++ 16-bit
-
- case wxFONTENCODING_CP437:
- charset = OEM_CHARSET;
- break;
-
- default:
- if ( exact )
- *exact = FALSE;
- // fall through
-
- case wxFONTENCODING_SYSTEM:
- charset = ANSI_CHARSET;
- }
-
- return charset;
-}
-