⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guifont.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 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 + -