home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2002 December (Special) / DOSV2002_12.iso / utility / tcl230ja95.lzh / source.lzh / exe / pagecolor.c < prev    next >
C/C++ Source or Header  |  2001-02-12  |  16KB  |  566 lines

  1. /*-------------------------------------------
  2.   pagecolor.c
  3.   "Color and Font" page
  4.   KAZUBON 1997-1998
  5. ---------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8.  
  9. static void OnInit(HWND hDlg);
  10. static void OnApply(HWND hDlg);
  11. static void InitColor(HWND hDlg);
  12. static void OnMeasureItemColorCombo(LPARAM lParam);
  13. static void OnDrawItemColorCombo(LPARAM lParam);
  14. static void OnChooseColor(HWND hDlg, WORD id);
  15. static void OnCheckColor2(HWND hDlg);
  16. static void InitComboFont(HWND hDlg);
  17. static void SetComboFontSize(HWND hDlg, int bInit);
  18. static HFONT hfontb;  // for IDC_BOLD
  19. static HFONT hfonti;  // for IDC_ITALIC
  20.  
  21. __inline void SendPSChanged(HWND hDlg)
  22. {
  23.     g_bApplyClock = TRUE;
  24.     SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)(hDlg), 0);
  25. }
  26.  
  27. /*------------------------------------------------
  28.   Dialog procedure
  29. --------------------------------------------------*/
  30. BOOL CALLBACK PageColorProc(HWND hDlg, UINT message,
  31.     WPARAM wParam, LPARAM lParam)
  32. {
  33.     switch(message)
  34.     {
  35.         case WM_INITDIALOG:
  36.             OnInit(hDlg);
  37.             return TRUE;
  38.         case WM_MEASUREITEM:
  39.             OnMeasureItemColorCombo(lParam);
  40.             return TRUE;
  41.         case WM_DRAWITEM:
  42.             OnDrawItemColorCombo(lParam);
  43.             return TRUE;
  44.         case WM_COMMAND:
  45.         {
  46.             WORD id, code;
  47.             id = LOWORD(wParam); code = HIWORD(wParam);
  48.             if((id == IDC_COLBACK || id == IDC_COLBACK2 ||
  49.                 id == IDC_COLFORE ||
  50.                 id == IDC_FONT || id == IDC_FONTSIZE) &&
  51.                 code == CBN_SELCHANGE)
  52.             {
  53.                 if(id == IDC_FONT) SetComboFontSize(hDlg, FALSE);
  54.                 SendPSChanged(hDlg);
  55.             }
  56.             else if(id == IDC_CHKCOLOR2)
  57.                 OnCheckColor2(hDlg);
  58.             else if(id == IDC_CHOOSECOLBACK || id == IDC_CHOOSECOLBACK2 ||
  59.                 id == IDC_CHOOSECOLFORE)
  60.                 OnChooseColor(hDlg, id);
  61.             else if(id == IDC_BOLD || id == IDC_ITALIC)
  62.                 SendPSChanged(hDlg);
  63.             else if((id == IDC_CLOCKHEIGHT || id == IDC_CLOCKWIDTH ||
  64.                 id == IDC_VERTPOS || id == IDC_LINEHEIGHT)
  65.                 && code == EN_CHANGE)
  66.                 SendPSChanged(hDlg);
  67.             return TRUE;
  68.         }
  69.         case WM_NOTIFY:
  70.             switch(((NMHDR *)lParam)->code)
  71.             {
  72.                 case PSN_APPLY: OnApply(hDlg); break;
  73.                 case PSN_HELP: MyHelp(GetParent(hDlg), 1); break;
  74.             }
  75.             return TRUE;
  76.         case WM_DESTROY:
  77.             DeleteObject(hfontb);
  78.             DeleteObject(hfonti);
  79.             break;
  80.     }
  81.     return FALSE;
  82. }
  83.  
  84. /*------------------------------------------------
  85.   Initialize
  86. --------------------------------------------------*/
  87. void OnInit(HWND hDlg)
  88. {
  89.     HDC hdc;
  90.     LOGFONT logfont;
  91.     HFONT hfont;
  92.     DWORD dwVer;
  93.     
  94.     // setting of "background" and "text"
  95.     InitColor(hDlg);
  96.     
  97.     // if color depth is 256 or less
  98.     hdc = CreateIC("DISPLAY", NULL, NULL, NULL);
  99.     if(GetDeviceCaps(hdc, BITSPIXEL) <= 8)
  100.     {
  101.         EnableDlgItem(hDlg, IDC_CHOOSECOLBACK, FALSE);
  102.         EnableDlgItem(hDlg, IDC_CHOOSECOLBACK2, FALSE);
  103.         EnableDlgItem(hDlg, IDC_CHOOSECOLFORE, FALSE);
  104.     }
  105.     DeleteDC(hdc);
  106.     
  107.     hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  108.     if(hfont)
  109.         SendDlgItemMessage(hDlg, IDC_FONT, WM_SETFONT, (WPARAM)hfont, 0);
  110.     
  111.     //「フォント」の設定
  112.     InitComboFont(hDlg);
  113.     //「フォントサイズ」の設定
  114.     SetComboFontSize(hDlg, TRUE);
  115.     
  116.     CheckDlgButton(hDlg, IDC_CHKCOLOR2,
  117.         GetMyRegLong("", "UseBackColor2", TRUE));
  118.     OnCheckColor2(hDlg);
  119.     
  120.     dwVer = GetVersion();
  121.     if(((dwVer & 0x80000000) && // 98/Me/2000
  122.            LOBYTE(LOWORD(dwVer)) >= 4 && HIBYTE(LOWORD(dwVer)) >= 10) ||
  123.        (!(dwVer & 0x80000000) && LOBYTE(LOWORD(dwVer)) >= 5)) ;
  124.     else // not (Win98 or 2000)
  125.     {
  126.         int i;
  127.         for(i = IDC_CHKCOLOR2; i <= IDC_CHOOSECOLBACK2; i++)
  128.             EnableDlgItem(hDlg, i, FALSE);
  129.     }
  130.     
  131.     //「Bold」「Italic」の設定
  132.     CheckDlgButton(hDlg, IDC_BOLD,
  133.         GetMyRegLong("", "Bold", FALSE));
  134.     CheckDlgButton(hDlg, IDC_ITALIC, 
  135.         GetMyRegLong("", "Italic", FALSE));
  136.     
  137.     hfontb = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0);
  138.     GetObject(hfontb, sizeof(LOGFONT), &logfont);
  139.     logfont.lfWeight = FW_BOLD;
  140.     hfontb = CreateFontIndirect(&logfont);
  141.     SendDlgItemMessage(hDlg, IDC_BOLD, WM_SETFONT, (WPARAM)hfontb, 0);
  142.  
  143.     logfont.lfWeight = FW_NORMAL;
  144.     logfont.lfItalic = 1;
  145.     hfonti = CreateFontIndirect(&logfont);
  146.     SendDlgItemMessage(hDlg, IDC_ITALIC, WM_SETFONT, (WPARAM)hfonti, 0);
  147.  
  148.     SendDlgItemMessage(hDlg, IDC_SPINCHEIGHT, UDM_SETRANGE, 0,
  149.         MAKELONG(32, -32));
  150.     SendDlgItemMessage(hDlg, IDC_SPINCHEIGHT, UDM_SETPOS, 0,
  151.         (int)(short)GetMyRegLong("", "ClockHeight", 0));
  152.     SendDlgItemMessage(hDlg, IDC_SPINCWIDTH, UDM_SETRANGE, 0,
  153.         MAKELONG(32, -32));
  154.     SendDlgItemMessage(hDlg, IDC_SPINCWIDTH, UDM_SETPOS, 0,
  155.         (int)(short)GetMyRegLong("", "ClockWidth", 0));
  156.     SendDlgItemMessage(hDlg, IDC_SPINVPOS, UDM_SETRANGE, 0,
  157.         MAKELONG(32, -32));
  158.     SendDlgItemMessage(hDlg, IDC_SPINVPOS, UDM_SETPOS, 0,
  159.         (int)(short)GetMyRegLong("", "VertPos", 0));
  160.     SendDlgItemMessage(hDlg, IDC_SPINLHEIGHT, UDM_SETRANGE, 0,
  161.         MAKELONG(32, -32));
  162.     SendDlgItemMessage(hDlg, IDC_SPINLHEIGHT, UDM_SETPOS, 0,
  163.         (int)(short)GetMyRegLong("", "LineHeight", 0));
  164. }
  165.  
  166. /*------------------------------------------------
  167.   Apply
  168. --------------------------------------------------*/
  169. void OnApply(HWND hDlg)
  170. {
  171.     DWORD dw;
  172.     char s[80];
  173.     
  174.     //背景色の保存
  175.     dw = CBGetItemData(hDlg, IDC_COLBACK, CBGetCurSel(hDlg, IDC_COLBACK));
  176.     SetMyRegLong("", "BackColor", dw);
  177.     
  178.     SetMyRegLong("", "UseBackColor2",
  179.         IsDlgButtonChecked(hDlg, IDC_CHKCOLOR2));
  180.     dw = CBGetItemData(hDlg, IDC_COLBACK2, CBGetCurSel(hDlg, IDC_COLBACK2));
  181.     SetMyRegLong("", "BackColor2", dw);
  182.     
  183.     //文字色の保存
  184.     dw = CBGetItemData(hDlg, IDC_COLFORE, CBGetCurSel(hDlg, IDC_COLFORE));
  185.     SetMyRegLong("", "ForeColor", dw);
  186.     
  187.     //フォント名の保存
  188.     CBGetLBText(hDlg, IDC_FONT, CBGetCurSel(hDlg, IDC_FONT), s);
  189.     SetMyRegStr("", "Font", s);
  190.     
  191.     //フォントサイズの保存
  192.     if(CBGetCount(hDlg, IDC_FONTSIZE) > 0)
  193.     {
  194.         CBGetLBText(hDlg, IDC_FONTSIZE, CBGetCurSel(hDlg, IDC_FONTSIZE), s);
  195.         SetMyRegLong("", "FontSize", atoi(s));
  196.     }
  197.     else SetMyRegLong("", "FontSize", 9);
  198.  
  199.     //「Bold」「Italic」の保存
  200.     SetMyRegLong("", "Bold", IsDlgButtonChecked(hDlg, IDC_BOLD));
  201.     SetMyRegLong("", "Italic", IsDlgButtonChecked(hDlg, IDC_ITALIC));
  202.     
  203.     SetMyRegLong("", "ClockHeight",
  204.         SendDlgItemMessage(hDlg, IDC_SPINCHEIGHT, UDM_GETPOS, 0, 0));
  205.     SetMyRegLong("", "ClockWidth",
  206.         SendDlgItemMessage(hDlg, IDC_SPINCWIDTH, UDM_GETPOS, 0, 0));
  207.     SetMyRegLong("", "VertPos",
  208.         SendDlgItemMessage(hDlg, IDC_SPINVPOS, UDM_GETPOS, 0, 0));
  209.     SetMyRegLong("", "LineHeight",
  210.         SendDlgItemMessage(hDlg, IDC_SPINLHEIGHT, UDM_GETPOS, 0, 0));
  211. }
  212.  
  213. /*------------------------------------------------
  214.  「色」コンボボックスの初期化
  215. --------------------------------------------------*/
  216. void InitColor(HWND hDlg)
  217. {
  218.     COLORREF col;
  219.     int i, j;
  220.     WORD id;
  221.     //Windowsデフォルト16色
  222.     int rgb[16][3] = {{0,0,0}, {128,0,0}, {0,128,0}, {128,128,0},
  223.         {0,0,128}, {128,0,128}, {0,128,128}, {192,192,192},
  224.         {128,128,128}, {255,0,0}, {0,255,0}, {255,255,0},
  225.         {0,0,255},{255,0,255}, {0,255,255}, {255,255,255}};
  226.     
  227.     for(i = 0; i < 3; i++)
  228.     {
  229.         if(i == 0) id = IDC_COLBACK;
  230.         else if(i == 1) id = IDC_COLBACK2;
  231.         else id = IDC_COLFORE;
  232.  
  233.         for(j = 0; j < 16; j++) //基本16色
  234.             CBAddString(hDlg, id,
  235.                 RGB(rgb[j][0], rgb[j][1], rgb[j][2]));
  236.         //ボタンの...色
  237.         CBAddString(hDlg, id, 0x80000000|COLOR_3DFACE);
  238.         CBAddString(hDlg, id, 0x80000000|COLOR_3DSHADOW);
  239.         CBAddString(hDlg, id, 0x80000000|COLOR_3DHILIGHT);
  240.         CBAddString(hDlg, id, 0x80000000|COLOR_BTNTEXT);
  241.         
  242.         //コンボボックスの色を選択
  243.         if(i == 0)
  244.             col = GetMyRegLong("", "BackColor",
  245.                 0x80000000 | COLOR_3DFACE);
  246.         else if(i == 1)
  247.             col = GetMyRegLong("", "BackColor2", col);
  248.         else
  249.             col = GetMyRegLong("", "ForeColor",
  250.                 0x80000000 | COLOR_BTNTEXT);
  251.         for(j = 0; j < 20; j++)
  252.         {
  253.             if(col == (COLORREF)CBGetItemData(hDlg, id, j))
  254.                 break;
  255.         }
  256.         if(j == 20) //20色中にないとき
  257.             CBAddString(hDlg, id, col);
  258.         CBSetCurSel(hDlg, id, j);
  259.     }
  260. }
  261.  
  262. /*------------------------------------------------
  263.  「色」コンボボックスの高さの設定
  264. --------------------------------------------------*/
  265. void OnMeasureItemColorCombo(LPARAM lParam)
  266. {
  267.     LPMEASUREITEMSTRUCT pmis;
  268.     
  269.     pmis = (LPMEASUREITEMSTRUCT)lParam;
  270.     pmis->itemHeight = 7 * HIWORD(GetDialogBaseUnits()) / 8;
  271. }
  272.  
  273. /*------------------------------------------------
  274.  「色」コンボボックスのオーナードロー
  275. --------------------------------------------------*/
  276. void OnDrawItemColorCombo(LPARAM lParam)
  277. {
  278.     LPDRAWITEMSTRUCT pdis;
  279.     HBRUSH hbr;
  280.     COLORREF col;
  281.     TEXTMETRIC tm;
  282.     int y;
  283.  
  284.     pdis = (LPDRAWITEMSTRUCT)lParam;
  285.     
  286.     if(IsWindowEnabled(pdis->hwndItem))
  287.     {
  288.         col = pdis->itemData;
  289.         if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  290.     }
  291.     else col = col = GetSysColor(COLOR_3DFACE);
  292.     
  293.     switch(pdis->itemAction)
  294.     {
  295.         case ODA_DRAWENTIRE:
  296.         case ODA_SELECT:
  297.         {
  298.             hbr = CreateSolidBrush(col);
  299.             FillRect(pdis->hDC, &pdis->rcItem, hbr);
  300.             DeleteObject(hbr);
  301.  
  302.             // print color names
  303.             if(16 <= pdis->itemID && pdis->itemID <= 19)
  304.             {
  305.                 char s[80];
  306.                 
  307.                 strcpy(s, MyString(IDS_BTNFACE + pdis->itemID - 16));
  308.                 SetBkMode(pdis->hDC, TRANSPARENT);
  309.                 GetTextMetrics(pdis->hDC, &tm);
  310.                 if(pdis->itemID == 19)
  311.                     SetTextColor(pdis->hDC, RGB(255,255,255));
  312.                 else
  313.                     SetTextColor(pdis->hDC, RGB(0,0,0));
  314.                 y = (pdis->rcItem.bottom - pdis->rcItem.top - tm.tmHeight)/2;
  315.                 TextOut(pdis->hDC, pdis->rcItem.left + 4, pdis->rcItem.top + y,
  316.                     s, strlen(s));
  317.             }
  318.             if(!(pdis->itemState & ODS_FOCUS)) break;
  319.         }
  320.         case ODA_FOCUS:
  321.         {
  322.             if(pdis->itemState & ODS_FOCUS)
  323.                 hbr = CreateSolidBrush(0);
  324.             else
  325.                 hbr = CreateSolidBrush(col);
  326.             FrameRect(pdis->hDC, &pdis->rcItem, hbr);
  327.             DeleteObject(hbr);
  328.             break;
  329.         }
  330.     }
  331. }
  332.  
  333. /*------------------------------------------------
  334.   enable/disable to use "background 2"
  335. --------------------------------------------------*/
  336. void OnCheckColor2(HWND hDlg)
  337. {
  338.     BOOL b;
  339.     b = IsDlgButtonChecked(hDlg, IDC_CHKCOLOR2);
  340.     EnableDlgItem(hDlg, IDC_COLBACK2, b);
  341.     EnableDlgItem(hDlg, IDC_CHOOSECOLBACK2, b);
  342.     SendPSChanged(hDlg);
  343. }
  344.  
  345. /*------------------------------------------------
  346.  色の選択 「...」ボタン
  347. --------------------------------------------------*/
  348. void OnChooseColor(HWND hDlg, WORD id)
  349. {
  350.     CHOOSECOLOR cc;
  351.     COLORREF col, colarray[16];
  352.     WORD idCombo;
  353.     int i;
  354.     
  355.     idCombo = id - 1;
  356.     
  357.     //最初に選ばれている色
  358.     col = CBGetItemData(hDlg, idCombo, CBGetCurSel(hDlg, idCombo));
  359.     if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  360.     
  361.     for(i = 0; i < 16; i++) colarray[i] = RGB(255,255,255);
  362.     
  363.     memset(&cc, 0, sizeof(CHOOSECOLOR));
  364.     cc.lStructSize = sizeof(CHOOSECOLOR);
  365.     cc.hwndOwner = hDlg;
  366.     cc.hInstance = g_hInst;
  367.     cc.rgbResult = col;
  368.     cc.lpCustColors = colarray;
  369.     cc.Flags = CC_FULLOPEN | CC_RGBINIT;
  370.     
  371.     if(!ChooseColor(&cc)) return;
  372.     
  373.     for(i = 0; i < 16; i++)
  374.     {
  375.         if(cc.rgbResult == (COLORREF)CBGetItemData(hDlg, idCombo, i))
  376.             break;
  377.     }
  378.     if(i == 16) //基本16色ではないとき
  379.     {
  380.         if(CBGetCount(hDlg, idCombo) == 20)
  381.             CBAddString(hDlg, idCombo, cc.rgbResult);
  382.         else
  383.             CBSetItemData(hDlg, idCombo, 20, cc.rgbResult);
  384.         i = 20;
  385.     }
  386.     CBSetCurSel(hDlg, idCombo, i);
  387.     
  388.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  389.     SendPSChanged(hDlg);
  390. }
  391.  
  392. // 参考:Visual C++ 4.x のサンプルWORDPADのFORMATBA.CPP
  393.  
  394. BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  395.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo);
  396. BOOL CALLBACK EnumSizeProcEx(ENUMLOGFONTEX* pelf, 
  397.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo);
  398. int nFontSizes[] = 
  399.     {8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72};
  400. int logpixelsy;
  401.  
  402. /*------------------------------------------------
  403.    Initialization of "Font" combo box
  404. --------------------------------------------------*/
  405. void InitComboFont(HWND hDlg)
  406. {
  407.     HDC hdc;
  408.     LOGFONT lf;
  409.     HWND hcombo;
  410.     char s[80];
  411.     int i;
  412.     
  413.     hdc = GetDC(NULL);
  414.     
  415.     // Enumerate fonts and set in the combo box
  416.     memset(&lf, 0, sizeof(LOGFONT));
  417.     hcombo = GetDlgItem(hDlg, IDC_FONT);
  418.     lf.lfCharSet = GetTextCharset(hdc);  // MS UI Gothic, ...
  419.     EnumFontFamiliesEx(hdc, &lf,
  420.         (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
  421.     lf.lfCharSet = OEM_CHARSET;   // Small Fonts, Terminal...
  422.     EnumFontFamiliesEx(hdc, &lf,
  423.         (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
  424.     lf.lfCharSet = DEFAULT_CHARSET;  // Arial, Courier, Times New Roman, ...
  425.     EnumFontFamiliesEx(hdc, &lf,
  426.         (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
  427.     ReleaseDC(NULL, hdc);
  428.     
  429.     GetMyRegStr("", "Font", s, 80, "");
  430.     if(s[0] == 0)
  431.     {
  432.         HFONT hfont;
  433.         hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  434.         if(hfont)
  435.         {
  436.             GetObject(hfont, sizeof(lf),(LPVOID)&lf);
  437.             strcpy(s, lf.lfFaceName);
  438.         }
  439.     }
  440.     i = CBFindStringExact(hDlg, IDC_FONT, s);
  441.     if(i == LB_ERR) i = 0;
  442.     CBSetCurSel(hDlg, IDC_FONT, i);
  443. }
  444.  
  445. /*------------------------------------------------
  446.  「フォントサイズ」コンボボックスの設定
  447. --------------------------------------------------*/
  448. void SetComboFontSize(HWND hDlg, BOOL bInit)
  449. {
  450.     HDC hdc;
  451.     char s[160];
  452.     DWORD size;
  453.     LOGFONT lf;
  454.     int i;
  455.  
  456.     //以前のsizeを保存
  457.     if(bInit) // WM_INITDIALOGのとき
  458.     {
  459.         size = GetMyRegLong("", "FontSize", 9);
  460.         if(size == 0) size = 9;
  461.     }
  462.     else   // IDC_FONTが変更されたとき
  463.     {
  464.         CBGetLBText(hDlg, IDC_FONTSIZE,
  465.             CBGetCurSel(hDlg, IDC_FONTSIZE), (LPARAM)s);
  466.         size = atoi(s);
  467.     }
  468.     
  469.     CBResetContent(hDlg, IDC_FONTSIZE);
  470.     
  471.     hdc = GetDC(NULL);
  472.     logpixelsy = GetDeviceCaps(hdc, LOGPIXELSY);
  473.     
  474.     // s = フォント名
  475.     CBGetLBText(hDlg, IDC_FONT, CBGetCurSel(hDlg, IDC_FONT), (LPARAM)s);
  476.     
  477.     //フォントのサイズを列挙してコンボボックスに入れる
  478.     memset(&lf, 0, sizeof(LOGFONT));
  479.     strcpy(lf.lfFaceName, s);
  480.     lf.lfCharSet = (BYTE)CBGetItemData(hDlg, IDC_FONT, CBGetCurSel(hDlg, IDC_FONT));
  481.     EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumSizeProcEx,
  482.         (LPARAM)GetDlgItem(hDlg, IDC_FONTSIZE), 0);
  483.     
  484.     //EnumFontFamilies(hdc, s,
  485.     //    (FONTENUMPROC)EnumSizeProc, (LPARAM)GetDlgItem(hDlg, IDC_FONTSIZE));
  486.     
  487.     ReleaseDC(NULL, hdc);
  488.     
  489.     // sizeに近いものを選択
  490.     for(; size > 0; size--)
  491.     {
  492.         wsprintf(s, "%d", size);
  493.         i = CBFindStringExact(hDlg, IDC_FONTSIZE, s);
  494.         if(i != LB_ERR)
  495.         {
  496.             CBSetCurSel(hDlg, IDC_FONTSIZE, i); return;
  497.         }
  498.     }
  499.     CBSetCurSel(hDlg, IDC_FONTSIZE, 0);
  500. }
  501.  
  502. /*------------------------------------------------
  503.   Callback function for enumerating fonts.
  504.   To set a font name in the combo box.
  505. --------------------------------------------------*/
  506. BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  507.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo)
  508. {
  509.     // if(FontType & RASTER_FONTTYPE) return 1;
  510.     if(pelf->elfLogFont.lfFaceName[0] != '@' && 
  511.         SendMessage((HWND)hCombo, CB_FINDSTRINGEXACT, 0, 
  512.             (LPARAM)pelf->elfLogFont.lfFaceName) == LB_ERR)
  513.     {
  514.         int index;
  515.         index = SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)pelf->elfLogFont.lfFaceName);
  516.         if(index >= 0)
  517.             SendMessage((HWND)hCombo, CB_SETITEMDATA,
  518.                 index, (LPARAM)pelf->elfLogFont.lfCharSet);
  519.     }
  520.     return 1;
  521. }
  522.  
  523. /*------------------------------------------------
  524.  フォントの列挙コールバック
  525.  コンボボックスにフォントサイズを入れる
  526. --------------------------------------------------*/
  527. BOOL CALLBACK EnumSizeProcEx(ENUMLOGFONTEX* pelf, 
  528.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo)
  529. {
  530.     char s[80];
  531.     int num, i, count;
  532.     
  533.     //トゥルータイプフォントまたは、
  534.     //トゥルータイプでもラスタフォントでもない場合
  535.     if((FontType & TRUETYPE_FONTTYPE) || 
  536.         !( (FontType & TRUETYPE_FONTTYPE) || (FontType & RASTER_FONTTYPE) ))
  537.     {
  538.         // nFontSizesの数字をそのまま入れる
  539.         for (i = 0; i < 16; i++)
  540.         {
  541.             wsprintf(s, "%d", nFontSizes[i]);
  542.             SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)s);
  543.         }
  544.         return FALSE;
  545.     }
  546.     
  547.     //それ以外の場合、1つ1つ数字を入れていく
  548.     num = (lpntm->ntmTm.tmHeight - lpntm->ntmTm.tmInternalLeading) * 72 / logpixelsy;
  549.     count = SendMessage((HWND)hCombo, CB_GETCOUNT, 0, 0);
  550.     for(i = 0; i < count; i++)
  551.     {
  552.         SendMessage((HWND)hCombo, CB_GETLBTEXT, i, (LPARAM)s);
  553.         if(num == atoi(s)) return TRUE;
  554.         else if(num < atoi(s))
  555.         {
  556.             wsprintf(s, "%d", num);
  557.             SendMessage((HWND)hCombo, CB_INSERTSTRING, i, (LPARAM)s);
  558.             return TRUE;
  559.         }
  560.     }
  561.     wsprintf(s, "%d", num);
  562.     SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)s);
  563.     return TRUE;
  564. }
  565.  
  566.