home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / combobox.c < prev    next >
Encoding:
C/C++ Source or Header  |  2004-03-06  |  10.1 KB  |  361 lines

  1. /*-------------------------------------------------------------
  2.   combobox.c : combo box for color, font, locale
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10.  
  11. /* -------------Owner-drawn Color combobox -------------------------------*/
  12.  
  13. /* Globals */
  14.  
  15. void InitColorCombo(HWND hDlg, int idCombo,
  16.     const COLORREF* pColAdd, int nAdd, COLORREF colDef);
  17. void OnMeasureItemColorCombo(LPMEASUREITEMSTRUCT pmis);
  18. void OnDrawItemColorCombo(LPDRAWITEMSTRUCT pdis, char (*pTexts)[80]);
  19. void ChooseColorWithCombo(HINSTANCE hInst, HWND hDlg,
  20.     int idCombo);
  21.  
  22. /*------------------------------------------------
  23.    initialize
  24. --------------------------------------------------*/
  25. void InitColorCombo(HWND hDlg, int idCombo,
  26.     const COLORREF *pColAdd, int nAdd, COLORREF colDef)
  27. {
  28.     int i;
  29.     
  30.     // Windows 16 colors 
  31.     int rgb[16][3] = {{0,0,0}, {128,0,0}, {0,128,0}, {128,128,0},
  32.         {0,0,128}, {128,0,128}, {0,128,128}, {192,192,192},
  33.         {128,128,128}, {255,0,0}, {0,255,0}, {255,255,0},
  34.         {0,0,255},{255,0,255}, {0,255,255}, {255,255,255}};
  35.     
  36.     for(i = 0; i < 16; i++) // 16 colors
  37.         CBAddString(hDlg, idCombo,
  38.             RGB(rgb[i][0], rgb[i][1], rgb[i][2]));
  39.     
  40.     for(i = 0; i < nAdd && pColAdd; i++)
  41.         CBAddString(hDlg, idCombo, pColAdd[i]);
  42.     
  43.     for(i = 0; i < CBGetCount(hDlg, idCombo); i++)
  44.     {
  45.         if(colDef == (COLORREF)CBGetItemData(hDlg, idCombo, i))
  46.             break;
  47.     }
  48.     
  49.     if(i == CBGetCount(hDlg, idCombo))
  50.         CBAddString(hDlg, idCombo, colDef);
  51.     
  52.     CBSetCurSel(hDlg, idCombo, i);
  53. }
  54.  
  55. /*------------------------------------------------
  56.   WM_MEASUREITEM message
  57. --------------------------------------------------*/
  58. void OnMeasureItemColorCombo(LPMEASUREITEMSTRUCT pmis)
  59. {
  60.     pmis->itemHeight = 7 * HIWORD(GetDialogBaseUnits()) / 8;
  61. }
  62.  
  63. /*------------------------------------------------
  64.   WM_DRAWITEM message
  65. --------------------------------------------------*/
  66. void OnDrawItemColorCombo(LPDRAWITEMSTRUCT pdis, char (*pTexts)[80])
  67. {
  68.     HBRUSH hbr;
  69.     COLORREF col;
  70.     TEXTMETRIC tm;
  71.     int y;
  72.     
  73.     if(IsWindowEnabled(pdis->hwndItem))
  74.     {
  75.         col = pdis->itemData;
  76.         if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  77.     }
  78.     else col = col = GetSysColor(COLOR_3DFACE);
  79.     
  80.     switch(pdis->itemAction)
  81.     {
  82.         case ODA_DRAWENTIRE:
  83.         case ODA_SELECT:
  84.         {
  85.             char *p = NULL;
  86.             
  87.             if(pTexts)
  88.             {
  89.                 if(pdis->itemData == (0x80000000|COLOR_3DFACE))
  90.                     p = pTexts[0];
  91.                 else if(pdis->itemData == (0x80000000|COLOR_3DSHADOW))
  92.                     p = pTexts[1];
  93.                 else if(pdis->itemData == (0x80000000|COLOR_3DHILIGHT))
  94.                     p = pTexts[2];
  95.                 else if(pdis->itemData == (0x80000000|COLOR_BTNTEXT))
  96.                     p = pTexts[3];
  97.             }
  98.             
  99.             hbr = CreateSolidBrush(col);
  100.             FillRect(pdis->hDC, &pdis->rcItem, hbr);
  101.             DeleteObject(hbr);
  102.             
  103.             // print color names
  104.             if(p)
  105.             {
  106.                 SetBkMode(pdis->hDC, TRANSPARENT);
  107.                 GetTextMetrics(pdis->hDC, &tm);
  108.                 if(pdis->itemID == 19)
  109.                     SetTextColor(pdis->hDC, RGB(255,255,255));
  110.                 else
  111.                     SetTextColor(pdis->hDC, RGB(0,0,0));
  112.                 y = (pdis->rcItem.bottom - pdis->rcItem.top - tm.tmHeight)/2;
  113.                 TextOut(pdis->hDC, pdis->rcItem.left + 4, pdis->rcItem.top + y,
  114.                     p, strlen(p));
  115.             }
  116.             if(!(pdis->itemState & ODS_FOCUS)) break;
  117.         }
  118.         case ODA_FOCUS:
  119.         {
  120.             if(pdis->itemState & ODS_FOCUS)
  121.                 hbr = CreateSolidBrush(0);
  122.             else
  123.                 hbr = CreateSolidBrush(col);
  124.             FrameRect(pdis->hDC, &pdis->rcItem, hbr);
  125.             DeleteObject(hbr);
  126.             break;
  127.         }
  128.     }
  129. }
  130.  
  131. /*--------------------------------------------------------
  132.   open a choose color dialog and set color to combobox
  133. ----------------------------------------------------------*/
  134. void ChooseColorWithCombo(HINSTANCE hInst, HWND hDlg,
  135.     int idCombo)
  136. {
  137.     CHOOSECOLOR cc;
  138.     COLORREF col, colarray[16];
  139.     int i;
  140.     
  141.     col = CBGetItemData(hDlg, idCombo, CBGetCurSel(hDlg, idCombo));
  142.     if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  143.     
  144.     for(i = 0; i < 16; i++) colarray[i] = RGB(255,255,255);
  145.     
  146.     memset(&cc, 0, sizeof(CHOOSECOLOR));
  147.     cc.lStructSize = sizeof(CHOOSECOLOR);
  148.     cc.hwndOwner = hDlg;
  149.     cc.hInstance = (HWND)hInst;
  150.     cc.rgbResult = col;
  151.     cc.lpCustColors = colarray;
  152.     cc.Flags = CC_FULLOPEN | CC_RGBINIT;
  153.     
  154.     if(!ChooseColor(&cc)) return;
  155.     
  156.     for(i = 0; i < CBGetCount(hDlg, idCombo); i++)
  157.     {
  158.         if(cc.rgbResult == (COLORREF)CBGetItemData(hDlg, idCombo, i))
  159.             break;
  160.     }
  161.     if(i == CBGetCount(hDlg, idCombo))
  162.         CBAddString(hDlg, idCombo, cc.rgbResult);
  163.     
  164.     CBSetCurSel(hDlg, idCombo, i);
  165. }
  166.  
  167. /* ---------------------- Font combobox -------------------------------*/
  168.  
  169. /* Globals */
  170.  
  171. void InitFontNameCombo(HWND hDlg, int idCombo, const char* deffont);
  172. void InitFontSizeCombo(HWND hDlg, int idCombo,
  173.     const char *fontname, int charset);
  174.  
  175. /* Statics */
  176.  
  177. static BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  178.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo);
  179. static BOOL CALLBACK EnumSizeProcEx(ENUMLOGFONTEX* pelf, 
  180.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo);
  181. static int m_nFontSizes[] = 
  182.     { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72};
  183. static int m_logpixelsy;
  184.  
  185. /*------------------------------------------------
  186.    initialize a "Font" combobox
  187. --------------------------------------------------*/
  188. void InitFontNameCombo(HWND hDlg, int idCombo, const char* deffont)
  189. {
  190.     HDC hdc;
  191.     LOGFONT lf;
  192.     HWND hcombo;
  193.     int i;
  194.     
  195.     CBResetContent(hDlg, idCombo);
  196.     
  197.     hdc = GetDC(NULL);
  198.     
  199.     // Enumerate fonts and set in the combo box
  200.     memset(&lf, 0, sizeof(LOGFONT));
  201.     hcombo = GetDlgItem(hDlg, idCombo);
  202.     lf.lfCharSet = (BYTE)GetTextCharset(hdc);  // MS UI Gothic, ...
  203.     EnumFontFamiliesEx(hdc, &lf,
  204.         (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
  205.     lf.lfCharSet = OEM_CHARSET;   // Small Fonts, Terminal...
  206.     EnumFontFamiliesEx(hdc, &lf,
  207.         (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
  208.     lf.lfCharSet = DEFAULT_CHARSET;  // Arial, Courier, Times New Roman, ...
  209.     EnumFontFamiliesEx(hdc, &lf,
  210.         (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
  211.     ReleaseDC(NULL, hdc);
  212.     
  213.     i = CBFindStringExact(hDlg, idCombo, deffont);
  214.     if(i == LB_ERR) i = 0;
  215.     CBSetCurSel(hDlg, idCombo, i);
  216. }
  217.  
  218. /*------------------------------------------------
  219.    initialize a "Font Size" combobox
  220. --------------------------------------------------*/
  221. void InitFontSizeCombo(HWND hDlg, int idCombo,
  222.     const char *fontname, int charset)
  223. {
  224.     HDC hdc;
  225.     LOGFONT lf;
  226.     
  227.     CBResetContent(hDlg, idCombo);
  228.     
  229.     hdc = GetDC(NULL);
  230.     m_logpixelsy = GetDeviceCaps(hdc, LOGPIXELSY);
  231.     
  232.     // enumerate font size
  233.     memset(&lf, 0, sizeof(LOGFONT));
  234.     strcpy(lf.lfFaceName, fontname);
  235.     lf.lfCharSet = (BYTE)charset;
  236.     EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumSizeProcEx,
  237.         (LPARAM)GetDlgItem(hDlg, idCombo), 0);
  238.     
  239.     ReleaseDC(NULL, hdc);
  240. }
  241.  
  242. /*------------------------------------------------
  243.   Callback function for enumerating fonts.
  244.   To set a font name in the combo box.
  245. --------------------------------------------------*/
  246. BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  247.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo)
  248. {
  249.     // if(FontType & RASTER_FONTTYPE) return 1;
  250.     if(pelf->elfLogFont.lfFaceName[0] != '@' && 
  251.         SendMessage((HWND)hCombo, CB_FINDSTRINGEXACT, 0, 
  252.             (LPARAM)pelf->elfLogFont.lfFaceName) == LB_ERR)
  253.     {
  254.         int index;
  255.         index = SendMessage((HWND)hCombo, CB_ADDSTRING,
  256.             0, (LPARAM)pelf->elfLogFont.lfFaceName);
  257.         if(index >= 0)
  258.             SendMessage((HWND)hCombo, CB_SETITEMDATA,
  259.                 index, (LPARAM)pelf->elfLogFont.lfCharSet);
  260.     }
  261.     return 1;
  262. }
  263.  
  264. /*------------------------------------------------
  265.   Callback function for enumerating fonts.
  266.   To set a font size in the combo box.
  267. --------------------------------------------------*/
  268. BOOL CALLBACK EnumSizeProcEx(ENUMLOGFONTEX* pelf, 
  269.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo)
  270. {
  271.     char s[80];
  272.     int num, i, count;
  273.     
  274.     // TrueType font, or not TrueType nor Raster font
  275.     if((FontType & TRUETYPE_FONTTYPE) || 
  276.         !( (FontType & TRUETYPE_FONTTYPE) || (FontType & RASTER_FONTTYPE) ))
  277.     {
  278.         for (i = 0; i < 16; i++)
  279.         {
  280.             wsprintf(s, "%d", m_nFontSizes[i]);
  281.             SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)s);
  282.         }
  283.         return FALSE;
  284.     }
  285.     
  286.     // Other case
  287.     num = (lpntm->ntmTm.tmHeight - lpntm->ntmTm.tmInternalLeading) * 72
  288.             / m_logpixelsy;
  289.     count = SendMessage((HWND)hCombo, CB_GETCOUNT, 0, 0);
  290.     for(i = 0; i < count; i++)
  291.     {
  292.         SendMessage((HWND)hCombo, CB_GETLBTEXT, i, (LPARAM)s);
  293.         if(num == atoi(s)) return TRUE;
  294.         else if(num < atoi(s))
  295.         {
  296.             wsprintf(s, "%d", num);
  297.             SendMessage((HWND)hCombo, CB_INSERTSTRING, i, (LPARAM)s);
  298.             return TRUE;
  299.         }
  300.     }
  301.     wsprintf(s, "%d", num);
  302.     SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)s);
  303.     
  304.     return TRUE;
  305. }
  306.  
  307. /* ---------------------- Locale combobox ------------------------------*/
  308.  
  309. /* Globals */
  310.  
  311. void InitLocaleCombo(HWND hDlg, int idCombo, int deflang);
  312.  
  313. /* Statics */
  314.  
  315. static BOOL CALLBACK EnumLocalesProc(LPTSTR lpLocaleString);
  316. static HWND m_hDlg;
  317. static int  m_idComboLocale;
  318. static int  m_codepage;
  319.  
  320. /*------------------------------------------------
  321.   initialize
  322. --------------------------------------------------*/
  323. void InitLocaleCombo(HWND hDlg, int idCombo, int deflang)
  324. {
  325.     int i, count;
  326.     
  327.     m_hDlg = hDlg; m_idComboLocale = idCombo;
  328.     m_codepage = GetCodePage(GetUserDefaultLangID());
  329.     
  330.     EnumSystemLocales(EnumLocalesProc, LCID_INSTALLED);
  331.     CBSetCurSel(hDlg, idCombo, 0);
  332.     count = CBGetCount(hDlg, idCombo);
  333.     for(i = 0; i < count; i++)
  334.     {
  335.         int x;
  336.         x = CBGetItemData(hDlg, idCombo, i);
  337.         if(x == deflang)
  338.         {
  339.             CBSetCurSel(hDlg, idCombo, i); break;
  340.         }
  341.     }
  342. }
  343.  
  344. /*------------------------------------------------
  345.   for EnumSystemLocales function
  346. --------------------------------------------------*/
  347. BOOL CALLBACK EnumLocalesProc(LPTSTR lpLocaleString)
  348. {
  349.     char s[81];
  350.     int x, index;
  351.     
  352.     x = atox(lpLocaleString);
  353.     if(MyGetLocaleInfoA(x, m_codepage, LOCALE_SLANGUAGE, s, 80) > 0)
  354.         index = CBAddString(m_hDlg, m_idComboLocale, (LPARAM)s);
  355.     else
  356.         index = CBAddString(m_hDlg, m_idComboLocale, (LPARAM)lpLocaleString);
  357.     CBSetItemData(m_hDlg, m_idComboLocale, index, x);
  358.     return TRUE;
  359. }
  360.  
  361.