font.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,056 行 · 第 1/2 页
CPP
1,056 行
// fall through
case wxFONTSTYLE_NORMAL:
lf.lfItalic = FALSE;
break;
case wxFONTSTYLE_ITALIC:
case wxFONTSTYLE_SLANT:
lf.lfItalic = TRUE;
break;
}
}
void wxNativeFontInfo::SetWeight(wxFontWeight weight)
{
switch ( weight )
{
default:
wxFAIL_MSG( _T("unknown font weight") );
// fall through
case wxFONTWEIGHT_NORMAL:
lf.lfWeight = FW_NORMAL;
break;
case wxFONTWEIGHT_LIGHT:
lf.lfWeight = FW_LIGHT;
break;
case wxFONTWEIGHT_BOLD:
lf.lfWeight = FW_BOLD;
break;
}
}
void wxNativeFontInfo::SetUnderlined(bool underlined)
{
lf.lfUnderline = underlined;
}
void wxNativeFontInfo::SetFaceName(wxString facename)
{
wxStrncpy(lf.lfFaceName, facename, WXSIZEOF(lf.lfFaceName));
}
void wxNativeFontInfo::SetFamily(wxFontFamily family)
{
BYTE ff_family;
wxString facename;
switch ( family )
{
case wxSCRIPT:
ff_family = FF_SCRIPT;
facename = _T("Script");
break;
case wxDECORATIVE:
ff_family = FF_DECORATIVE;
facename = _T("Old English Text MT");
break;
case wxROMAN:
ff_family = FF_ROMAN;
facename = _T("Times New Roman");
break;
case wxTELETYPE:
case wxMODERN:
ff_family = FF_MODERN;
facename = _T("Courier New");
break;
case wxSWISS:
ff_family = FF_SWISS;
facename = _T("Arial");
break;
case wxDEFAULT:
default:
{
// We want Windows 2000 or later to have new fonts even MS Shell Dlg
// is returned as default GUI font for compatibility
int verMaj;
ff_family = FF_SWISS;
if(wxGetOsVersion(&verMaj) == wxWINDOWS_NT && verMaj >= 5)
facename = _T("MS Shell Dlg 2");
else
facename = _T("MS Shell Dlg");
}
}
lf.lfPitchAndFamily = (BYTE)(DEFAULT_PITCH) | ff_family;
if ( !wxStrlen(lf.lfFaceName) )
{
SetFaceName(facename);
}
}
void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding)
{
wxNativeEncodingInfo info;
if ( !wxGetNativeFontEncoding(encoding, &info) )
{
#if wxUSE_FONTMAP
if ( wxFontMapper::Get()->GetAltForEncoding(encoding, &info) )
{
if ( !info.facename.empty() )
{
// if we have this encoding only in some particular facename, use
// the facename - it is better to show the correct characters in a
// wrong facename than unreadable text in a correct one
SetFaceName(info.facename);
}
}
else
#endif // wxUSE_FONTMAP
{
// unsupported encoding, replace with the default
info.charset = DEFAULT_CHARSET;
}
}
lf.lfCharSet = (BYTE)info.charset;
}
bool wxNativeFontInfo::FromString(const wxString& s)
{
long l;
wxStringTokenizer tokenizer(s, _T(";"));
// first the version
wxString token = tokenizer.GetNextToken();
if ( token != _T('0') )
return false;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfHeight = l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfWidth = l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfEscapement = l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfOrientation = l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfWeight = l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfItalic = (BYTE)l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfUnderline = (BYTE)l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfStrikeOut = (BYTE)l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfCharSet = (BYTE)l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfOutPrecision = (BYTE)l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfClipPrecision = (BYTE)l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfQuality = (BYTE)l;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
lf.lfPitchAndFamily = (BYTE)l;
token = tokenizer.GetNextToken();
if(!token)
return false;
wxStrcpy(lf.lfFaceName, token.c_str());
return true;
}
wxString wxNativeFontInfo::ToString() const
{
wxString s;
s.Printf(_T("%d;%ld;%ld;%ld;%ld;%ld;%d;%d;%d;%d;%d;%d;%d;%d;%s"),
0, // version, in case we want to change the format later
lf.lfHeight,
lf.lfWidth,
lf.lfEscapement,
lf.lfOrientation,
lf.lfWeight,
lf.lfItalic,
lf.lfUnderline,
lf.lfStrikeOut,
lf.lfCharSet,
lf.lfOutPrecision,
lf.lfClipPrecision,
lf.lfQuality,
lf.lfPitchAndFamily,
lf.lfFaceName);
return s;
}
// ----------------------------------------------------------------------------
// wxFont
// ----------------------------------------------------------------------------
void wxFont::Init()
{
}
bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
{
UnRef();
m_refData = new wxFontRefData(info, hFont);
RealizeResource();
return true;
}
wxFont::wxFont(const wxString& fontdesc)
{
wxNativeFontInfo info;
if ( info.FromString(fontdesc) )
(void)Create(info);
}
/* Constructor for a font. Note that the real construction is done
* in wxDC::SetFont, when information is available about scaling etc.
*/
bool wxFont::DoCreate(int pointSize,
const wxSize& pixelSize,
bool sizeUsingPixels,
int family,
int style,
int weight,
bool underlined,
const wxString& faceName,
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 = wxNORMAL_FONT->GetPointSize();
}
m_refData = new wxFontRefData(pointSize, pixelSize, sizeUsingPixels,
family, style, weight,
underlined, faceName, encoding);
RealizeResource();
return true;
}
wxFont::~wxFont()
{
}
// ----------------------------------------------------------------------------
// real implementation
// ----------------------------------------------------------------------------
bool wxFont::RealizeResource()
{
if ( GetResourceHandle() )
{
// VZ: the old code returned false in this case, but it doesn't seem
// to make sense because the font _was_ created
return true;
}
return M_FONTDATA->Alloc(this);
}
bool wxFont::FreeResource(bool WXUNUSED(force))
{
if ( GetResourceHandle() )
{
M_FONTDATA->Free();
return true;
}
return false;
}
WXHANDLE wxFont::GetResourceHandle() const
{
return (WXHANDLE)GetHFONT();
}
WXHFONT wxFont::GetHFONT() const
{
return M_FONTDATA ? M_FONTDATA->GetHFONT() : 0;
}
bool wxFont::IsFree() const
{
return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
}
void wxFont::Unshare()
{
// Don't change shared data
if ( !m_refData )
{
m_refData = new wxFontRefData();
}
else
{
wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
UnRef();
m_refData = ref;
}
}
// ----------------------------------------------------------------------------
// change font attribute: we recreate font when doing it
// ----------------------------------------------------------------------------
void wxFont::SetPointSize(int pointSize)
{
Unshare();
M_FONTDATA->SetPointSize(pointSize);
RealizeResource();
}
void wxFont::SetPixelSize(const wxSize& pixelSize)
{
Unshare();
M_FONTDATA->SetPixelSize(pixelSize);
RealizeResource();
}
void wxFont::SetFamily(int family)
{
Unshare();
M_FONTDATA->SetFamily(family);
RealizeResource();
}
void wxFont::SetStyle(int style)
{
Unshare();
M_FONTDATA->SetStyle(style);
RealizeResource();
}
void wxFont::SetWeight(int weight)
{
Unshare();
M_FONTDATA->SetWeight(weight);
RealizeResource();
}
void wxFont::SetFaceName(const wxString& faceName)
{
Unshare();
M_FONTDATA->SetFaceName(faceName);
RealizeResource();
}
void wxFont::SetUnderlined(bool underlined)
{
Unshare();
M_FONTDATA->SetUnderlined(underlined);
RealizeResource();
}
void wxFont::SetEncoding(wxFontEncoding encoding)
{
Unshare();
M_FONTDATA->SetEncoding(encoding);
RealizeResource();
}
void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
{
Unshare();
FreeResource();
*M_FONTDATA = wxFontRefData(info);
RealizeResource();
}
// ----------------------------------------------------------------------------
// accessors
// ----------------------------------------------------------------------------
int wxFont::GetPointSize() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->GetPointSize();
}
wxSize wxFont::GetPixelSize() const
{
return M_FONTDATA->GetPixelSize();
}
bool wxFont::IsUsingSizeInPixels() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->IsUsingSizeInPixels();
}
int wxFont::GetFamily() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->GetFamily();
}
int wxFont::GetStyle() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->GetStyle();
}
int wxFont::GetWeight() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->GetWeight();
}
bool wxFont::GetUnderlined() const
{
wxCHECK_MSG( Ok(), false, wxT("invalid font") );
return M_FONTDATA->GetUnderlined();
}
wxString wxFont::GetFaceName() const
{
wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
return M_FONTDATA->GetFaceName();
}
wxFontEncoding wxFont::GetEncoding() const
{
wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
return M_FONTDATA->GetEncoding();
}
const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
{
return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
: NULL;
}
bool wxFont::IsFixedWidth() const
{
if ( M_FONTDATA->HasNativeFontInfo() )
{
// the two low-order bits specify the pitch of the font, the rest is
// family
BYTE pitch =
(BYTE)(M_FONTDATA->GetNativeFontInfo().lf.lfPitchAndFamily & PITCH_MASK);
return pitch == FIXED_PITCH;
}
return wxFontBase::IsFixedWidth();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?