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

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