home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 December (DVD) / VPR0112A.ISO / OLS / TCL230JA95 / tcl230ja95.lzh / source.lzh / exe / pageskin.c < prev    next >
C/C++ Source or Header  |  2001-02-17  |  20KB  |  723 lines

  1. /*-------------------------------------------
  2.   pageskin.c
  3.   "skin" page of properties
  4.   Kazubon 1997-2001
  5. ---------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8.  
  9. static void OnInit(HWND hDlg);
  10. static void OnApply(HWND hDlg);
  11. static void OnStartBtn(HWND hDlg);
  12. static void OnSansho(HWND hDlg, WORD id);
  13. static void OnSanshoMenu(HWND hDlg, WORD id);
  14. static void OnStartMenu(HWND hDlg);
  15. static void InitColor(HWND hDlg);
  16. static void OnMeasureItemColorCombo(LPARAM lParam);
  17. static void OnDrawItemColorCombo(LPARAM lParam);
  18. static void OnChooseColor(HWND hDlg, WORD id);
  19. static void SetColorFromBmp(HWND hDlg, int idCombo, char* fname);
  20. static BOOL SelectIconInDLL(HWND hDlg, char* fname);
  21. static int nFilterIndex = 1;
  22.  
  23. __inline void SendPSChanged(HWND hDlg)
  24. {
  25.     g_bApplyTaskbar = TRUE;
  26.     SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)(hDlg), 0);
  27. }
  28.  
  29. /*------------------------------------------------
  30.    dialog procedure of this page
  31. --------------------------------------------------*/
  32. BOOL CALLBACK PageSkinProc(HWND hDlg, UINT message,
  33.     WPARAM wParam, LPARAM lParam)
  34. {
  35.     switch(message)
  36.     {
  37.         case WM_INITDIALOG:
  38.             OnInit(hDlg);
  39.             return TRUE;
  40.         case WM_MEASUREITEM:
  41.             OnMeasureItemColorCombo(lParam);
  42.             return TRUE;
  43.         case WM_DRAWITEM:
  44.             OnDrawItemColorCombo(lParam);
  45.             return TRUE;
  46.         case WM_COMMAND:
  47.         {
  48.             WORD id, code;
  49.             id = LOWORD(wParam); code = HIWORD(wParam);
  50.             // 「スタートボタンを改造する」
  51.             if(id == IDC_STARTBTN)
  52.                 OnStartBtn(hDlg);
  53.             // 「ビットマップ」「キャプション」テキストボックス
  54.             else if((id == IDC_FILESTART || id == IDC_CAPTIONSTART ||
  55.                 id == IDC_FILEMENU)
  56.                 && code == EN_CHANGE)
  57.                 SendPSChanged(hDlg);
  58.             // 「...」 スタートメニューのアイコン参照
  59.             else if(id == IDC_SANSHOSTART)
  60.                 OnSansho(hDlg, id);
  61.             // 「...」 スタートメニューのビットマップ参照
  62.             else if(id == IDC_SANSHOMENU)
  63.                 OnSanshoMenu(hDlg, id);
  64.             // 「スタートメニューを改造する」
  65.             else if(id == IDC_STARTMENU)
  66.                 OnStartMenu(hDlg);
  67.             // コンボボックス
  68.             else if(id == IDC_COLMENU && code == CBN_SELCHANGE)
  69.                 SendPSChanged(hDlg);
  70.             //「...」色の選択
  71.             else if(id == IDC_CHOOSECOLMENU)
  72.                 OnChooseColor(hDlg, id);
  73.             else if(id == IDC_TILEMENU) // 「並べる」
  74.                 SendPSChanged(hDlg);
  75.             return TRUE;
  76.         }
  77.         case WM_NOTIFY:
  78.             switch(((NMHDR *)lParam)->code)
  79.             {
  80.                 case PSN_APPLY: OnApply(hDlg); break;
  81.                 case PSN_HELP: MyHelp(GetParent(hDlg), 5); break;
  82.             }
  83.             return TRUE;
  84.     }
  85.     return FALSE;
  86. }
  87.  
  88. /*------------------------------------------------
  89.   initialize
  90. --------------------------------------------------*/
  91. void OnInit(HWND hDlg)
  92. {
  93.     char s[1024];
  94.     HFONT hfont;
  95.     
  96.     hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  97.     if(hfont)
  98.     {
  99.         SendDlgItemMessage(hDlg, IDC_FILESTART,
  100.             WM_SETFONT, (WPARAM)hfont, 0);
  101.         SendDlgItemMessage(hDlg, IDC_CAPTIONSTART,
  102.             WM_SETFONT, (WPARAM)hfont, 0);
  103.         SendDlgItemMessage(hDlg, IDC_FILEMENU,
  104.             WM_SETFONT, (WPARAM)hfont, 0);
  105.     }
  106.     
  107.     CheckDlgButton(hDlg, IDC_STARTBTN,
  108.         GetMyRegLong("", "StartButton", FALSE));
  109.     
  110.     GetMyRegStr("", "StartButtonIcon", s, 1024, "");
  111.     SetDlgItemText(hDlg, IDC_FILESTART, s);
  112.     
  113.     GetMyRegStr("", "StartButtonCaption", s, 80, MyString(IDS_START));
  114.     SetDlgItemText(hDlg, IDC_CAPTIONSTART, s);
  115.     
  116.     OnStartBtn(hDlg);
  117.     
  118.     CheckDlgButton(hDlg, IDC_STARTMENU,
  119.         GetMyRegLong("", "StartMenu", FALSE));
  120.     
  121.     GetMyRegStr("", "StartMenuBmp", s, 1024, "");
  122.     SetDlgItemText(hDlg, IDC_FILEMENU, s);
  123.     
  124.     CheckDlgButton(hDlg, IDC_TILEMENU,
  125.         GetMyRegLong("", "StartMenuTile", FALSE));
  126.     
  127.     InitColor(hDlg);
  128.     OnStartMenu(hDlg);
  129. }
  130.  
  131. /*------------------------------------------------
  132.   apply
  133. --------------------------------------------------*/
  134. void OnApply(HWND hDlg)
  135. {
  136.     char s[1024];
  137.     DWORD dw;
  138.  
  139.     SetMyRegLong("", "StartButton", IsDlgButtonChecked(hDlg, IDC_STARTBTN));
  140.     
  141.     GetDlgItemText(hDlg, IDC_FILESTART, s, 1024);
  142.     SetMyRegStr("", "StartButtonIcon", s);
  143.     
  144.     GetDlgItemText(hDlg, IDC_CAPTIONSTART, s, 80);
  145.     SetMyRegStr("", "StartButtonCaption", s);
  146.  
  147.     SetMyRegLong("", "StartMenu", IsDlgButtonChecked(hDlg, IDC_STARTMENU));
  148.     
  149.     GetDlgItemText(hDlg, IDC_FILEMENU, s, 1024);
  150.     SetMyRegStr("", "StartMenuBmp", s);
  151.  
  152.     dw = CBGetItemData(hDlg, IDC_COLMENU, CBGetCurSel(hDlg, IDC_COLMENU));
  153.     SetMyRegLong("", "StartMenuCol", dw);
  154.  
  155.     SetMyRegLong("", "StartMenuTile",
  156.         IsDlgButtonChecked(hDlg, IDC_TILEMENU));
  157. }
  158.  
  159. /*------------------------------------------------
  160.  「スタートボタンを改造する」
  161. --------------------------------------------------*/
  162. void OnStartBtn(HWND hDlg)
  163. {
  164.     BOOL b;
  165.     int i;
  166.     
  167.     b = IsDlgButtonChecked(hDlg, IDC_STARTBTN);
  168.     for(i = IDC_LABFILESTART; i <= IDC_CAPTIONSTART; i++)
  169.         EnableDlgItem(hDlg, i, b);
  170.     SendPSChanged(hDlg);
  171. }
  172.  
  173. /*------------------------------------------------
  174.  「...」 スタートボタンのアイコン参照
  175. --------------------------------------------------*/
  176. void OnSansho(HWND hDlg, WORD id)
  177. {
  178.     char filter[160], deffile[MAX_PATH], fname[MAX_PATH+10];
  179.     char s[MAX_PATH+10], num[10];
  180.     HFILE hf = HFILE_ERROR; char head[2];
  181.     
  182.     filter[0] = filter[1] = 0;
  183.     str0cat(filter, MyString(IDS_BMPICONFILE)); str0cat(filter, "*.bmp;*.ico");
  184.     str0cat(filter, MyString(IDS_EXEDLLFILE)); str0cat(filter, "*.exe;*.dll");
  185.     str0cat(filter, MyString(IDS_ALLFILE)); str0cat(filter, "*.*");
  186.     
  187.     deffile[0] = 0;
  188.     GetDlgItemText(hDlg, id - 1, s, MAX_PATH);
  189.     if(s[0])
  190.     {
  191.         parse(deffile, s, 0);
  192.         parse(num, s, 1);
  193.         hf = _lopen(deffile, OF_READ);
  194.     }
  195.     if(hf != HFILE_ERROR)
  196.     {
  197.         _lread(hf, head, 2);
  198.         _lclose(hf);
  199.         
  200.         if(head[0] == 'M' && head[1] == 'Z') //実行ファイル
  201.         {
  202.             // 「アイコンの選択」ダイアログ
  203.             if(SelectIconInDLL(hDlg, deffile))
  204.             {
  205.                 SetDlgItemText(hDlg, id - 1, deffile);
  206.                 PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  207.                 SendPSChanged(hDlg);
  208.             }
  209.             return;
  210.         }
  211.     }
  212.     
  213.     if(!SelectMyFile(hDlg, filter, 0, deffile, fname)) // propsheet.c
  214.         return;
  215.     
  216.     hf = _lopen(fname, OF_READ);
  217.     if(hf == HFILE_ERROR) return;
  218.     _lread(hf, head, 2);
  219.     _lclose(hf);
  220.     if(head[0] == 'M' && head[1] == 'Z') //実行ファイル
  221.     {
  222.         // 「アイコンの選択」ダイアログ
  223.         if(!SelectIconInDLL(hDlg, fname)) return;
  224.     }
  225.     
  226.     SetDlgItemText(hDlg, id - 1, fname);
  227.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  228.     SendPSChanged(hDlg);
  229. }
  230.  
  231. /*------------------------------------------------
  232.  「...」 スタートメニューのビットマップ参照
  233. --------------------------------------------------*/
  234. void OnSanshoMenu(HWND hDlg, WORD id)
  235. {
  236.     char filter[80], deffile[MAX_PATH], fname[MAX_PATH];
  237.     
  238.     filter[0] = filter[1] = 0;
  239.     str0cat(filter, MyString(IDS_BMPFILE)); str0cat(filter, "*.bmp");
  240.     str0cat(filter, MyString(IDS_ALLFILE)); str0cat(filter, "*.*");
  241.     
  242.     GetDlgItemText(hDlg, id - 1, deffile, MAX_PATH);
  243.     
  244.     if(!SelectMyFile(hDlg, filter, 0, deffile, fname)) // propsheet.c
  245.         return;
  246.     
  247.     SetColorFromBmp(hDlg, IDC_COLMENU, fname);
  248.     
  249.     SetDlgItemText(hDlg, id - 1, fname);
  250.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  251.     SendPSChanged(hDlg);
  252. }
  253.  
  254. /*------------------------------------------------
  255.  「色」コンボボックスの初期化
  256. --------------------------------------------------*/
  257. void InitColor(HWND hDlg)
  258. {
  259.     COLORREF col;
  260.     int i;
  261.     //Windowsデフォルト16色
  262.     int rgb[16][3] = {{0,0,0}, {128,0,0}, {0,128,0}, {128,128,0},
  263.         {0,0,128}, {128,0,128}, {0,128,128}, {192,192,192},
  264.         {128,128,128}, {255,0,0}, {0,255,0}, {255,255,0},
  265.         {0,0,255},{255,0,255}, {0,255,255}, {255,255,255}};
  266.     
  267.     for(i = 0; i < 16; i++) //基本16色
  268.         CBAddString(hDlg, IDC_COLMENU,
  269.             RGB(rgb[i][0], rgb[i][1], rgb[i][2]));
  270.     
  271.     col = GetMyRegLong("", "StartMenuCol", RGB(128, 128, 128));
  272.     
  273.     for(i = 0; i < 16; i++)
  274.     {
  275.         if(col == (COLORREF)CBGetItemData(hDlg, IDC_COLMENU, i))
  276.             break;
  277.     }
  278.     if(i == 16) //16色中にないとき
  279.         CBAddString(hDlg, IDC_COLMENU, col);
  280.     CBSetCurSel(hDlg, IDC_COLMENU, i);
  281. }
  282.  
  283. /*------------------------------------------------
  284.  「スタートメニューを改造する」
  285. --------------------------------------------------*/
  286. void OnStartMenu(HWND hDlg)
  287. {
  288.     BOOL b;
  289.     int i;
  290.     HDC hdc;
  291.  
  292.     b = IsDlgButtonChecked(hDlg, IDC_STARTMENU);
  293.     for(i = IDC_LABFILEMENU; i <= IDC_TILEMENU; i++)
  294.         EnableDlgItem(hDlg, i, b);
  295.     SendPSChanged(hDlg);
  296.     
  297.     //環境が256色以下のときは、色の選択を無効に
  298.     hdc = CreateIC("DISPLAY", NULL, NULL, NULL);
  299.     if(GetDeviceCaps(hdc, BITSPIXEL) <= 8)
  300.         EnableDlgItem(hDlg, IDC_CHOOSECOLMENU, FALSE);
  301.     DeleteDC(hdc);
  302. }
  303.  
  304. /*------------------------------------------------
  305.  「色」コンボボックスの高さの設定
  306. --------------------------------------------------*/
  307. void OnMeasureItemColorCombo(LPARAM lParam)
  308. {
  309.     LPMEASUREITEMSTRUCT pmis;
  310.     
  311.     pmis = (LPMEASUREITEMSTRUCT)lParam;
  312.     pmis->itemHeight = 7 * HIWORD(GetDialogBaseUnits()) / 8;
  313. }
  314.  
  315. /*------------------------------------------------
  316.  「色」コンボボックスのオーナードロー
  317. --------------------------------------------------*/
  318. void OnDrawItemColorCombo(LPARAM lParam)
  319. {
  320.     LPDRAWITEMSTRUCT pdis;
  321.     HBRUSH hbr;
  322.     COLORREF col;
  323.     
  324.     pdis = (LPDRAWITEMSTRUCT)lParam;
  325.     
  326.     col = pdis->itemData;
  327.     if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  328.  
  329.     switch(pdis->itemAction)
  330.     {
  331.         case ODA_DRAWENTIRE:
  332.         case ODA_SELECT:
  333.         {
  334.             hbr = CreateSolidBrush(col);
  335.             FillRect(pdis->hDC, &pdis->rcItem, hbr);
  336.             DeleteObject(hbr);
  337.             if(!(pdis->itemState & ODS_FOCUS)) break;
  338.         }
  339.         case ODA_FOCUS:
  340.         {
  341.             if(pdis->itemState & ODS_FOCUS)
  342.                 hbr = CreateSolidBrush(0);
  343.             else
  344.                 hbr = CreateSolidBrush(col);
  345.             FrameRect(pdis->hDC, &pdis->rcItem, hbr);
  346.             DeleteObject(hbr);
  347.             break;
  348.         }
  349.     }
  350. }
  351.  
  352. /*------------------------------------------------
  353.  色の選択 「...」ボタン
  354. --------------------------------------------------*/
  355. void OnChooseColor(HWND hDlg, WORD id)
  356. {
  357.     CHOOSECOLOR cc;
  358.     COLORREF col, colarray[16];
  359.     WORD idCombo;
  360.     int i;
  361.     
  362.     idCombo = id - 1;
  363.     
  364.     //最初に選ばれている色
  365.     col = CBGetItemData(hDlg, idCombo, CBGetCurSel(hDlg, idCombo));
  366.     if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  367.     
  368.     for(i = 0; i < 16; i++) colarray[i] = RGB(255,255,255);
  369.     
  370.     memset(&cc, 0, sizeof(CHOOSECOLOR));
  371.     cc.lStructSize = sizeof(CHOOSECOLOR);
  372.     cc.hwndOwner = hDlg;
  373.     cc.hInstance = g_hInst;
  374.     cc.rgbResult = col;
  375.     cc.lpCustColors = colarray;
  376.     cc.Flags = CC_FULLOPEN | CC_RGBINIT;
  377.     
  378.     if(!ChooseColor(&cc)) return;
  379.     
  380.     for(i = 0; i < 16; i++)
  381.     {
  382.         if(cc.rgbResult == (COLORREF)CBGetItemData(hDlg, idCombo, i))
  383.             break;
  384.     }
  385.     if(i == 16) //基本16色ではないとき
  386.     {
  387.         if(CBGetCount(hDlg, idCombo) == 16)
  388.             CBAddString(hDlg, idCombo, cc.rgbResult);
  389.         else
  390.             CBSetItemData(hDlg, idCombo, 16, cc.rgbResult);
  391.         i = 16;
  392.     }
  393.     CBSetCurSel(hDlg, idCombo, i);
  394.     
  395.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  396.     SendPSChanged(hDlg);
  397. }
  398.  
  399. /*------------------------------------------------
  400.    Select "Color" combo box automatically.
  401. --------------------------------------------------*/
  402. #define WIDTHBYTES(i) ((i+31)/32*4)
  403.  
  404. void SetColorFromBmp(HWND hDlg, int idCombo, char* fname)
  405. {
  406.     HFILE hf;
  407.     BITMAPFILEHEADER bmfh;
  408.     BITMAPINFOHEADER bmih;
  409.     int numColors;
  410.     BYTE pixel[3];
  411.     COLORREF col;
  412.     int i, index;
  413.     HDC hdc;
  414.     
  415.     hf = _lopen(fname, OF_READ);
  416.     if(hf == HFILE_ERROR) return;
  417.     
  418.     if(_lread(hf, &bmfh, sizeof(bmfh)) != sizeof(bmfh) ||
  419.         bmfh.bfType != *(WORD*)"BM" ||
  420.         _lread(hf, &bmih, sizeof(bmih)) != sizeof(bmih) ||
  421.         bmih.biSize != sizeof(bmih) ||
  422.         bmih.biCompression != BI_RGB ||
  423.         !(bmih.biBitCount <= 8 || bmih.biBitCount == 24))
  424.     {
  425.         _lclose(hf); return;
  426.     }
  427.     numColors = bmih.biClrUsed;
  428.     if(numColors == 0)
  429.     {
  430.         if(bmih.biBitCount <= 8) numColors = 1 << bmih.biBitCount;
  431.         else numColors = 0;
  432.     }
  433.     if(numColors > 0 &&
  434.         _llseek(hf, sizeof(RGBQUAD)*numColors, FILE_CURRENT) == HFILE_ERROR)
  435.     {
  436.         _lclose(hf); return;
  437.     }
  438.     if(_llseek(hf,
  439.             WIDTHBYTES(bmih.biWidth*bmih.biBitCount)*(bmih.biHeight-1),
  440.             FILE_CURRENT) == HFILE_ERROR ||
  441.         _lread(hf, pixel, sizeof(pixel)) != sizeof(pixel))
  442.     {
  443.         _lclose(hf); return;
  444.     }
  445.     if(bmih.biBitCount < 24)
  446.     {
  447.         index = -1;
  448.         if(bmih.biBitCount == 8) index = pixel[0];
  449.         else if(bmih.biBitCount == 4)
  450.             index = (pixel[0] & 0xF0) >> 4;
  451.         else if(bmih.biBitCount == 1)
  452.             index = (pixel[0] & 0x80) >> 7;
  453.         if(_llseek(hf, sizeof(bmfh)+sizeof(bmih)+sizeof(RGBQUAD)*index,
  454.             FILE_BEGIN) == HFILE_ERROR ||
  455.             _lread(hf, pixel, sizeof(pixel)) != sizeof(pixel))
  456.         {
  457.             index = -1;
  458.         }
  459.     }
  460.     _lclose(hf);
  461.     if(index == -1) return;
  462.     col = RGB(pixel[2], pixel[1], pixel[0]);
  463.     
  464.     for(i = 0; i < 16; i++)
  465.     {
  466.         if(col == (COLORREF)CBGetItemData(hDlg, idCombo, i)) break;
  467.     }
  468.     if(i == 16)
  469.     {
  470.         int screencolor;
  471.         hdc = CreateIC("DISPLAY", NULL, NULL, NULL);
  472.         screencolor = GetDeviceCaps(hdc, BITSPIXEL);
  473.         DeleteDC(hdc);
  474.         if(screencolor <= 8) return;
  475.         
  476.         if(CBGetCount(hDlg, idCombo) == 16)
  477.             CBAddString(hDlg, idCombo, col);
  478.         else CBSetItemData(hDlg, idCombo, 16, col);
  479.     }
  480.     CBSetCurSel(hDlg, idCombo, i);
  481. }
  482.  
  483. //------------------------------------------------------------------
  484. // 以下、アイコン選択ダイアログ
  485.  
  486. BOOL CALLBACK DlgProcSelectIcon(HWND hDlg, UINT message,
  487.     WPARAM wParam, LPARAM lParam);
  488. char* fname_SelectIcon;
  489.  
  490. /*-----------------------------------------------------------------
  491.  アイコンの選択
  492.  fnameは、
  493.   実行ファイルのとき、"A:\WINDOWS\SYSTEM\SHELL32.DLL,8"
  494.     それ以外のとき、  "C:\MY PROGRAM\TCLOCK\NIKO.BMP" などとなる
  495. -------------------------------------------------------------------*/
  496. BOOL SelectIconInDLL(HWND hDlg, char* fname)
  497. {
  498.     fname_SelectIcon = fname;
  499.     if(DialogBox(GetLangModule(), MAKEINTRESOURCE(IDD_SELECTICON),
  500.         hDlg, DlgProcSelectIcon) != IDOK) return FALSE;
  501.     return TRUE;
  502. }
  503.  
  504. static BOOL InitSelectIcon(HWND hDlg);
  505. static void EndSelectIcon(HWND hDlg);
  506. static void OnOKSelectIcon(HWND hDlg);
  507. static void OnMeasureItemListSelectIcon(HWND hDlg, LPARAM lParam);
  508. static void OnDrawItemListSelectIcon(LPARAM lParam);
  509. static void OnSanshoSelectIcon(HWND hDlg);
  510.  
  511. /*------------------------------------------------
  512.  アイコン選択ダイアログプロシージャ
  513. --------------------------------------------------*/
  514. BOOL CALLBACK DlgProcSelectIcon(HWND hDlg, UINT message,
  515.     WPARAM wParam, LPARAM lParam)
  516. {
  517.     switch(message)
  518.     {
  519.         case WM_INITDIALOG:
  520.             if(!InitSelectIcon(hDlg))
  521.                 EndDialog(hDlg, IDCANCEL);
  522.             return TRUE;
  523.         case WM_MEASUREITEM:
  524.             OnMeasureItemListSelectIcon(hDlg, lParam);
  525.             return TRUE;
  526.         case WM_DRAWITEM:
  527.             OnDrawItemListSelectIcon(lParam);
  528.             return TRUE;
  529.         case WM_COMMAND:
  530.         {
  531.             WORD id, code;
  532.             id = LOWORD(wParam); code = HIWORD(wParam);
  533.             if(id == IDC_SANSHOICON) OnSanshoSelectIcon(hDlg);
  534.             else if(id == IDOK || id == IDCANCEL)
  535.             {
  536.                 if(id == IDOK) OnOKSelectIcon(hDlg);
  537.                 EndSelectIcon(hDlg);
  538.                 EndDialog(hDlg, id);
  539.             }
  540.             return TRUE;
  541.         }
  542.     }
  543.     return FALSE;
  544. }
  545.  
  546. /*------------------------------------------------
  547.  アイコン選択ダイアログの初期化
  548. --------------------------------------------------*/
  549. BOOL InitSelectIcon(HWND hDlg)
  550. {
  551.     int i, count, index;
  552.     HICON hicon, hiconl;
  553.     char msg[MAX_PATH];
  554.     char fname[MAX_PATH], num[10];
  555.     
  556.     parse(fname, fname_SelectIcon, 0);
  557.     parse(num, fname_SelectIcon, 1);
  558.     if(num[0] == 0) index = 0;
  559.     else index = atoi(num);
  560.     
  561.     count = (int)ExtractIcon(g_hInst, fname, (UINT)-1);
  562.     if(count == 0)
  563.     {
  564.         strcpy(msg, MyString(IDS_NOICON));
  565.         strcat(msg, "\n");
  566.         strcat(msg, fname);
  567.         MyMessageBox(hDlg, msg, "TClock", MB_OK, MB_ICONEXCLAMATION);
  568.         return FALSE;
  569.     }
  570.     
  571.     EndSelectIcon(hDlg);
  572.     SendDlgItemMessage(hDlg, IDC_LISTICON, LB_RESETCONTENT, 0, 0);
  573.     
  574.     for(i = 0; i < count; i++)
  575.     {
  576.         hiconl = NULL; hicon = NULL;
  577.         ExtractIconEx(fname, i, &hiconl, &hicon, 1);
  578.         if(hiconl) DestroyIcon(hiconl);
  579.         SendDlgItemMessage(hDlg, IDC_LISTICON, LB_ADDSTRING, 0,
  580.             (LPARAM)hicon);
  581.     }
  582.     SetDlgItemText(hDlg, IDC_FNAMEICON, fname);
  583.     SendDlgItemMessage(hDlg, IDC_LISTICON, LB_SETCURSEL,
  584.         index, 0);
  585.     strcpy(fname_SelectIcon, fname);
  586.     return TRUE;
  587. }
  588.  
  589. /*------------------------------------------------
  590.  アイコン選択ダイアログの後始末
  591. --------------------------------------------------*/
  592. void EndSelectIcon(HWND hDlg)
  593. {
  594.     int i, count;
  595.     HICON hicon;
  596.     count = SendDlgItemMessage(hDlg, IDC_LISTICON, LB_GETCOUNT, 0, 0);
  597.     for(i = 0; i < count; i++)
  598.     {
  599.         hicon = (HICON)SendDlgItemMessage(hDlg, IDC_LISTICON,
  600.             LB_GETITEMDATA, i, 0);
  601.         if(hicon) DestroyIcon(hicon);
  602.     }
  603. }
  604.  
  605. /*------------------------------------------------
  606.  アイコン選択ダイアログの「OK」
  607. --------------------------------------------------*/
  608. void OnOKSelectIcon(HWND hDlg)
  609. {
  610.     char num[10];
  611.     int index;
  612.     
  613.     GetDlgItemText(hDlg, IDC_FNAMEICON, fname_SelectIcon, MAX_PATH);
  614.     index = SendDlgItemMessage(hDlg, IDC_LISTICON, LB_GETCURSEL, 0, 0);
  615.     wsprintf(num, ",%d", index);
  616.     strcat(fname_SelectIcon, num);
  617. }
  618.  
  619. /*------------------------------------------------
  620.  アイコンリストのサイズを決める
  621. --------------------------------------------------*/
  622. void OnMeasureItemListSelectIcon(HWND hDlg, LPARAM lParam)
  623. {
  624.     LPMEASUREITEMSTRUCT pMis;
  625.     RECT rc;
  626.  
  627.     pMis = (LPMEASUREITEMSTRUCT)lParam;
  628.     GetClientRect(GetDlgItem(hDlg, pMis->CtlID), &rc);
  629.     pMis->itemHeight = rc.bottom;
  630.     pMis->itemWidth = 32;
  631. }
  632.  
  633. /*------------------------------------------------
  634.  アイコンリストの描画
  635. --------------------------------------------------*/
  636. void OnDrawItemListSelectIcon(LPARAM lParam)
  637. {
  638.     LPDRAWITEMSTRUCT pDis;
  639.     HBRUSH hbr;
  640.     COLORREF col;
  641.     RECT rc;
  642.     int cxicon, cyicon;
  643.  
  644.     pDis = (LPDRAWITEMSTRUCT)lParam;
  645.     
  646.     switch(pDis->itemAction)
  647.     {
  648.         case ODA_DRAWENTIRE:
  649.         case ODA_SELECT:
  650.         {
  651.             if(pDis->itemState & ODS_SELECTED)
  652.                 col = GetSysColor(COLOR_HIGHLIGHT);
  653.             else col = GetSysColor(COLOR_WINDOW);
  654.             hbr = CreateSolidBrush(col);
  655.             FillRect(pDis->hDC, &pDis->rcItem, hbr);
  656.             DeleteObject(hbr);
  657.             if(!(pDis->itemState & ODS_FOCUS)) break;
  658.         }
  659.         case ODA_FOCUS:
  660.         {
  661.             if(pDis->itemState & ODS_FOCUS)
  662.                 col = GetSysColor(COLOR_WINDOWTEXT);
  663.             else
  664.                 col = GetSysColor(COLOR_WINDOW);
  665.             hbr = CreateSolidBrush(col);
  666.             FrameRect(pDis->hDC, &pDis->rcItem, hbr);
  667.             DeleteObject(hbr);
  668.             break;
  669.         }
  670.     }
  671.     
  672.     if(pDis->itemData == 0) return;
  673.     
  674.     cxicon = GetSystemMetrics(SM_CXSMICON);
  675.     cyicon = GetSystemMetrics(SM_CYSMICON);
  676.  
  677.     CopyRect(&rc, &(pDis->rcItem));
  678.     DrawIconEx(pDis->hDC,
  679.         rc.left + (rc.right - rc.left - cxicon)/2,
  680.         rc.top + (rc.bottom - rc.top - cyicon)/2,
  681.         (HICON)pDis->itemData,
  682.         cxicon, cyicon, 0, NULL, DI_NORMAL);
  683. }
  684.  
  685. /*------------------------------------------------
  686.  アイコンの選択の中のファイルの参照
  687. --------------------------------------------------*/
  688. void OnSanshoSelectIcon(HWND hDlg)
  689. {
  690.     char filter[160], deffile[MAX_PATH], fname[MAX_PATH];
  691.     HFILE hf = HFILE_ERROR;
  692.     char head[2];
  693.     
  694.     filter[0] = filter[1] = 0;
  695.     str0cat(filter, MyString(IDS_BMPICONFILE)); str0cat(filter, "*.bmp;*.ico");
  696.     str0cat(filter, MyString(IDS_EXEDLLFILE)); str0cat(filter, "*.exe;*.dll");
  697.     str0cat(filter, MyString(IDS_ALLFILE)); str0cat(filter, "*.*");
  698.     
  699.     GetDlgItemText(hDlg, IDC_FNAMEICON, deffile, MAX_PATH);
  700.     
  701.     if(!SelectMyFile(hDlg, filter, 2, deffile, fname))
  702.         return;
  703.     
  704.     hf = _lopen(fname, OF_READ);
  705.     if(hf == HFILE_ERROR) return;
  706.     _lread(hf, head, 2);
  707.     _lclose(hf);
  708.     strcpy(fname_SelectIcon, fname);
  709.     
  710.     if(head[0] == 'M' && head[1] == 'Z') //実行ファイル
  711.     {
  712.         if(InitSelectIcon(hDlg))
  713.             PostMessage(hDlg, WM_NEXTDLGCTL,
  714.                 (WPARAM)GetDlgItem(hDlg, IDC_LISTICON), TRUE);
  715.     }
  716.     else
  717.     {
  718.         EndSelectIcon(hDlg);
  719.         EndDialog(hDlg, IDOK);
  720.     }
  721. }
  722.  
  723.