home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / TCL228 / TCL228.lzh / DLLSRC.lzh / font.c < prev    next >
C/C++ Source or Header  |  1999-09-18  |  3KB  |  114 lines

  1. /*-------------------------------------------
  2.   font.c
  3.   create a font of the clock
  4.          KAZUBON 1999
  5. ---------------------------------------------*/
  6. #include "tcdll.h"
  7.  
  8. struct {
  9.     int cp;
  10.     BYTE charset;
  11. } codepage_charset[] = {
  12.     { 932,  SHIFTJIS_CHARSET },
  13.     { 936,  GB2312_CHARSET },
  14.     { 949,  HANGEUL_CHARSET },
  15.     { 950,  CHINESEBIG5_CHARSET },
  16.     { 1250, EASTEUROPE_CHARSET },
  17.     { 1251, RUSSIAN_CHARSET },
  18.     { 1252, ANSI_CHARSET },
  19.     { 1253, GREEK_CHARSET },
  20.     { 1254, TURKISH_CHARSET },
  21.     { 1257, BALTIC_CHARSET },
  22.     { 0, 0}
  23. };
  24.  
  25. int GetLocaleInfoWA(WORD wLanguageID, LCTYPE LCType, char* dst, int n);
  26.  
  27. /*------------------------------------------------
  28.    callback function for EnumFontFamiliesEx,
  29.    to find a designated font
  30. --------------------------------------------------*/
  31. BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  32.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM fontname)
  33. {
  34.     if(strcmp((LPSTR)fontname, pelf->elfLogFont.lfFaceName) == 0)
  35.         return FALSE;
  36.     return TRUE;
  37. }
  38.  
  39. /*------------------------------------------------
  40.    create a font of the clock
  41. --------------------------------------------------*/
  42. HFONT CreateMyFont(char* fontname, int fontsize,
  43.     LONG weight, LONG italic)
  44. {
  45.     LOGFONT lf;
  46.     POINT pt;
  47.     HDC hdc;
  48.     WORD langid;
  49.     char s[11];
  50.     int cp;
  51.     BYTE charset;
  52.     int i;
  53.     
  54.     memset(&lf, 0, sizeof(LOGFONT));
  55.     
  56.     langid = (WORD)GetMyRegLong(NULL, "Locale", (int)GetUserDefaultLangID());
  57.     cp = CP_ACP;
  58.     if(GetLocaleInfoWA(langid, LOCALE_IDEFAULTANSICODEPAGE, s, 10) > 0)
  59.     {
  60.         char *p;
  61.         p = s; cp = 0;
  62.         while('0' <= *p && *p <= '9') cp = cp * 10 + *p++ - '0';
  63.         if(!IsValidCodePage(cp)) cp = CP_ACP;
  64.     }
  65.     
  66.     charset = 0;
  67.     for(i = 0; codepage_charset[i].cp; i++)
  68.     {
  69.         if(cp == codepage_charset[i].cp)
  70.         {
  71.             charset = codepage_charset[i].charset; break;
  72.         }
  73.     }
  74.     
  75.     hdc = GetDC(NULL);
  76.     
  77.     // find a font named "fontname"
  78.     if(charset == 0) charset = GetTextCharset(hdc);
  79.     lf.lfCharSet = charset;
  80.     if(EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc,
  81.         (LPARAM)fontname, 0))
  82.     {
  83.         lf.lfCharSet = OEM_CHARSET;
  84.         if(EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc,
  85.             (LPARAM)fontname, 0))
  86.         {
  87.             lf.lfCharSet = ANSI_CHARSET;
  88.             EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc,
  89.                 (LPARAM)fontname, 0);
  90.         }
  91.     }
  92.     
  93.     pt.x = 0;
  94.     pt.y = GetDeviceCaps(hdc, LOGPIXELSY) * fontsize / 72;
  95.     DPtoLP(hdc, &pt, 1);
  96.     lf.lfHeight = -pt.y;
  97.     
  98.     ReleaseDC(NULL, hdc);
  99.     
  100.     lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;
  101.     lf.lfWeight = weight;
  102.     lf.lfItalic = (BYTE)italic;
  103.     lf.lfUnderline = 0;
  104.     lf.lfStrikeOut = 0;
  105.     //lf.lfCharSet = ;
  106.     lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
  107.     lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  108.     lf.lfQuality = DEFAULT_QUALITY;
  109.     lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
  110.     strcpy(lf.lfFaceName, fontname);
  111.     
  112.     return CreateFontIndirect(&lf);
  113. }
  114.