📄 guifont.cpp
字号:
// guifont.cpp
#include <windows.h>
#include "msc.h"
#include "guifont.h"
//////////////////////////////
// 僔僗僥儉僼僅儞僩 //
//////////////////////////////
// 僨僗僋僩僢僾偱巊傢傟偰偄傞僼僅儞僩柤傪庢摼偡傞乮ANSI斉乯
// szFontName 偵偼 LF_FACESIZE 偺挿偝傪妋曐偣傛
// szFontName 偲 pHeight 偼昁梫偱側偗傟偽 NULL 偱傕壜
// 惉岟偡傟偽僼僅儞僩偺暥帤僙僢僩傪, 幐攕偡傟偽晧悢傪曉偡
int GetDesktopFontA ( char *szFontName, int *pHeight ) {
LOGFONTA LogFont ;
*LogFont.lfFaceName = 0 ;
if ( ! SystemParametersInfoA ( SPI_GETICONTITLELOGFONT, sizeof(LOGFONTA), & LogFont, 0 ) || ! *LogFont.lfFaceName ) return -1 ;
if ( szFontName ) strcpy ( szFontName, LogFont.lfFaceName ) ;
if ( pHeight ) *pHeight = LogFont.lfHeight ;
return LogFont.lfCharSet ;
}
// 僨僗僋僩僢僾偱巊傢傟偰偄傞僼僅儞僩柤傪庢摼偡傞乮UNICODE斉乯
// szFontName 偵偼 LF_FACESIZE 偺挿偝傪妋曐偣傛
// szFontName 偲 pHeight 偼昁梫偱側偗傟偽 NULL 偱傕壜
// 惉岟偡傟偽僼僅儞僩偺暥帤僙僢僩傪, 幐攕偡傟偽晧悢傪曉偡
int GetDesktopFontW ( wchar_t *szFontName, int *pHeight ) {
LOGFONTW LogFont ;
*LogFont.lfFaceName = 0 ;
if ( ! SystemParametersInfoW ( SPI_GETICONTITLELOGFONT, sizeof(LOGFONTW), & LogFont, 0 ) || ! *LogFont.lfFaceName ) return -1 ;
if ( szFontName ) wcscpy ( szFontName, LogFont.lfFaceName ) ;
if ( pHeight ) *pHeight = LogFont.lfHeight ;
return LogFont.lfCharSet ;
}
//////////////////////////////
// 僐乕僪儁乕僕 //
//////////////////////////////
// 僐乕僪儁乕僕偐傜暥帤僙僢僩傪曉偡
static int CodePageToCharSet ( int nCodePage ) {
CHARSETINFO CharsetInfo ;
if ( ! IsValidCodePage ( nCodePage ) || ! TranslateCharsetInfo ( (unsigned long*) nCodePage, & CharsetInfo, TCI_SRCCODEPAGE ) ) return ANSI_CHARSET ;
return CharsetInfo.ciCharset ;
}
//////////////////////////////
// 揟宆揑側僼僅儞僩 //
//////////////////////////////
// 揟宆揑側僼僅儞僩柤傪曉偡乮ANSI斉乯
static const char *GetWellKnownFontA ( int nCharset, int IsUseLocalName ) {
switch ( nCharset ) {
case SHIFTJIS_CHARSET : return ( ! IsUseLocalName ) ? "MS PGothic" : "俵俽 俹僑僔僢僋" ;
case GB2312_CHARSET : return ( ! IsUseLocalName ) ? "SimSun" : "\xCB\xCE\xCC\xE5" ;
case HANGUL_CHARSET : return ( ! IsUseLocalName ) ? "Gulim" : "\xB1\xBC\xB8\xB2" ;
case CHINESEBIG5_CHARSET : return ( ! IsUseLocalName ) ? "MingLiU" : "\xB2\xD3\xA9\xFA\xC5\xE9" ;
case THAI_CHARSET : return "Tahoma" ;
default : return "Arial" ;
}
}
// 揟宆揑側僼僅儞僩柤傪曉偡乮UNICODE斉乯
static const wchar_t *GetWellKnownFontW ( int nCharset, int IsUseLocalName ) {
switch ( nCharset ) {
case SHIFTJIS_CHARSET : return ( ! IsUseLocalName ) ? L"MS PGothic" : L"俵俽 俹僑僔僢僋" ;
case GB2312_CHARSET : return ( ! IsUseLocalName ) ? L"SimSun" : L"憊懱" ;
case HANGUL_CHARSET : return ( ! IsUseLocalName ) ? L"Gulim" : L"\xAD74\xB9BC" ;
case CHINESEBIG5_CHARSET : return ( ! IsUseLocalName ) ? L"PMingLiU" : L"怴嵶柧閾" ;
case THAI_CHARSET : return L"Tahoma" ;
default : return L"Arial" ;
}
}
//////////////////////////////
// VISTA梡僼僅儞僩 //
//////////////////////////////
// WindowsXP 梡偺僔僗僥儉梡僼僅儞僩柤傪儘乕僇儖柤偱曉偡乮UNICODE斉乯
static const wchar_t *GetXpGuiFontW ( int nCharset ) {
switch ( nCharset ) {
case SHIFTJIS_CHARSET : return L"MS UI Gothic" ;
case GB2312_CHARSET : return L"Tahoma" ;
case HANGUL_CHARSET : return L"\xAD74\xB9BC" ;
case CHINESEBIG5_CHARSET : return L"怴嵶柧閾" ;
case THAI_CHARSET : return L"Tahoma" ;
default : return L"Tahoma" ;
}
}
//////////////////////////////
// 僼僅儞僩嶌惉 //
//////////////////////////////
// 僼僅儞僩嶌惉梡偺撪晹娭悢
static HFONT CreateFontInternal ( int nSize, int nCodePage, int IsAllowSegoe ) {
int nHeight ;
if ( nSize > 0 ) {
HDC hDC = GetDC ( NULL ) ;
nHeight = - MulDiv ( nSize, GetDeviceCaps ( hDC, LOGPIXELSY ), 72 ) ;
ReleaseDC ( NULL, hDC ) ;
}
else if ( ! nSize ) {
if ( IsNT () ) { if ( GetDesktopFontW ( NULL, & nHeight ) < 0 ) nHeight = -12 ; }
else { if ( GetDesktopFontA ( NULL, & nHeight ) < 0 ) nHeight = -12 ; }
}
else {
nHeight = nSize ;
}
if ( IsNT () ) {
int nCharset ;
int nFontFamily = FF_DONTCARE ;
const wchar_t *szFontName = NULL ;
wchar_t szBuffer [ LF_FACESIZE ] ;
if ( ! nCodePage ) {
if ( IsAllowSegoe || ! IsWinVISTAorLater () ) {
nCharset = GetDesktopFontW ( szBuffer, NULL ) ;
if ( nCharset >= 0 ) szFontName = szBuffer ;
else nCodePage = GetACP () ;
}
else {
nCharset = CodePageToCharSet ( GetACP () ) ;
szFontName = GetXpGuiFontW ( nCharset ) ;
}
}
if ( nCodePage ) {
nCharset = CodePageToCharSet ( nCodePage ) ;
szFontName = GetWellKnownFontW ( nCharset, ( (int) GetACP () == nCodePage ) ) ;
nFontFamily = ( nCharset == GB2312_CHARSET || nCharset == CHINESEBIG5_CHARSET ) ? FF_MODERN : FF_SWISS ;
}
return CreateFontW ( nHeight, 0, 0, 0, 0, FALSE, FALSE, FALSE, nCharset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | nFontFamily, szFontName ) ;
}
else {
int nCharset ;
int nFontFamily = FF_DONTCARE ;
const char *szFontName = NULL ;
char szBuffer [ LF_FACESIZE ] ;
if ( ! nCodePage ) {
if ( IsAllowSegoe || ! IsWinVISTAorLater () ) {
nCharset = GetDesktopFontA ( szBuffer, NULL ) ;
if ( nCharset >= 0 ) szFontName = szBuffer ;
else nCodePage = GetACP () ;
}
else {
nCharset = CodePageToCharSet ( GetACP () ) ;
WideCharToMultiByte ( CP_ACP, 0, GetXpGuiFontW ( nCharset ), -1, szBuffer, LF_FACESIZE, NULL, NULL ) ;
szFontName = szBuffer ;
}
}
if ( nCodePage ) {
nCharset = CodePageToCharSet ( nCodePage ) ;
szFontName = GetWellKnownFontA ( nCharset, ( (int) GetACP () == nCodePage ) ) ;
nFontFamily = ( nCharset == GB2312_CHARSET || nCharset == CHINESEBIG5_CHARSET ) ? FF_MODERN : FF_SWISS ;
}
return CreateFontA ( nHeight, 0, 0, 0, 0, FALSE, FALSE, FALSE, nCharset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | nFontFamily, szFontName ) ;
}
}
// 僐乕僪儁乕僕偐傜僼僅儞僩傪嶌惉偡傞
// 僐乕僪儁乕僕偑 0 側傜偽 昞帵梡僼僅儞僩傪嶌惉偡傞
// 僒僀僘偑惓悢側傜億僀儞僩悢丄晧悢側傜僺僋僙儖悢偲偡傞
// 僒僀僘偑 0 側傜丄婛掕偺僒僀僘偱嶌惉偡傞
HFONT CreateFontByCodePage ( int nSize, int nCodePage ) {
return CreateFontInternal ( nSize, nCodePage, 0 ) ;
}
// 昞帵梡僼僅儞僩傪嶌惉偡傞
// 僒僀僘偑惓悢側傜億僀儞僩悢丄晧悢側傜僺僋僙儖悢偲偡傞
// 僒僀僘偑 0 側傜丄婛掕偺僒僀僘偱嶌惉偡傞
HFONT CreateGuiFont ( int nSize ) {
return CreateFontInternal ( nSize, 0, 0 ) ;
}
// 昞帵梡僼僅儞僩傪嶌惉偡傞乮Vista梡僼僅儞僩懳墳乯
// 僒僀僘偑惓悢側傜億僀儞僩悢丄晧悢側傜僺僋僙儖悢偲偡傞
// 僒僀僘偑 0 側傜丄婛掕偺僒僀僘偱嶌惉偡傞
HFONT CreateVistaGuiFont ( int nSize ) {
return CreateFontInternal ( nSize, 0, 1 ) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -