home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------
- pagecolor.c
- "Color and Font" page
- KAZUBON 1997-1998
- ---------------------------------------------*/
-
- #include "tclock.h"
-
- static void OnInit(HWND hDlg);
- static void OnApply(HWND hDlg);
- static void InitColor(HWND hDlg);
- static void OnMeasureItemColorCombo(LPARAM lParam);
- static void OnDrawItemColorCombo(LPARAM lParam);
- static void OnChooseColor(HWND hDlg, WORD id);
- static void OnCheckColor2(HWND hDlg);
- static void InitComboFont(HWND hDlg);
- static void SetComboFontSize(HWND hDlg, int bInit);
- static HFONT hfontb; // for IDC_BOLD
- static HFONT hfonti; // for IDC_ITALIC
-
- __inline void SendPSChanged(HWND hDlg)
- {
- g_bApplyClock = TRUE;
- SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)(hDlg), 0);
- }
-
- /*------------------------------------------------
- Dialog procedure
- --------------------------------------------------*/
- BOOL CALLBACK PageColorProc(HWND hDlg, UINT message,
- WPARAM wParam, LPARAM lParam)
- {
- switch(message)
- {
- case WM_INITDIALOG:
- OnInit(hDlg);
- return TRUE;
- case WM_MEASUREITEM:
- OnMeasureItemColorCombo(lParam);
- return TRUE;
- case WM_DRAWITEM:
- OnDrawItemColorCombo(lParam);
- return TRUE;
- case WM_COMMAND:
- {
- WORD id, code;
- id = LOWORD(wParam); code = HIWORD(wParam);
- if((id == IDC_COLBACK || id == IDC_COLBACK2 ||
- id == IDC_COLFORE ||
- id == IDC_FONT || id == IDC_FONTSIZE) &&
- code == CBN_SELCHANGE)
- {
- if(id == IDC_FONT) SetComboFontSize(hDlg, FALSE);
- SendPSChanged(hDlg);
- }
- else if(id == IDC_CHKCOLOR2)
- OnCheckColor2(hDlg);
- else if(id == IDC_CHOOSECOLBACK || id == IDC_CHOOSECOLBACK2 ||
- id == IDC_CHOOSECOLFORE)
- OnChooseColor(hDlg, id);
- else if(id == IDC_BOLD || id == IDC_ITALIC)
- SendPSChanged(hDlg);
- else if((id == IDC_CLOCKHEIGHT || id == IDC_CLOCKWIDTH ||
- id == IDC_VERTPOS || id == IDC_LINEHEIGHT)
- && code == EN_CHANGE)
- SendPSChanged(hDlg);
- return TRUE;
- }
- case WM_NOTIFY:
- switch(((NMHDR *)lParam)->code)
- {
- case PSN_APPLY: OnApply(hDlg); break;
- case PSN_HELP: MyHelp(GetParent(hDlg), 1); break;
- }
- return TRUE;
- case WM_DESTROY:
- DeleteObject(hfontb);
- DeleteObject(hfonti);
- break;
- }
- return FALSE;
- }
-
- /*------------------------------------------------
- Initialize
- --------------------------------------------------*/
- void OnInit(HWND hDlg)
- {
- HDC hdc;
- LOGFONT logfont;
- HFONT hfont;
- DWORD dwVer;
-
- // setting of "background" and "text"
- InitColor(hDlg);
-
- // if color depth is 256 or less
- hdc = CreateIC("DISPLAY", NULL, NULL, NULL);
- if(GetDeviceCaps(hdc, BITSPIXEL) <= 8)
- {
- EnableDlgItem(hDlg, IDC_CHOOSECOLBACK, FALSE);
- EnableDlgItem(hDlg, IDC_CHOOSECOLBACK2, FALSE);
- EnableDlgItem(hDlg, IDC_CHOOSECOLFORE, FALSE);
- }
- DeleteDC(hdc);
-
- hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
- if(hfont)
- SendDlgItemMessage(hDlg, IDC_FONT, WM_SETFONT, (WPARAM)hfont, 0);
-
- //「フォント」の設定
- InitComboFont(hDlg);
- //「フォントサイズ」の設定
- SetComboFontSize(hDlg, TRUE);
-
- CheckDlgButton(hDlg, IDC_CHKCOLOR2,
- GetMyRegLong("", "UseBackColor2", TRUE));
- OnCheckColor2(hDlg);
-
- dwVer = GetVersion();
- if(((dwVer & 0x80000000) && // 98/Me/2000
- LOBYTE(LOWORD(dwVer)) >= 4 && HIBYTE(LOWORD(dwVer)) >= 10) ||
- (!(dwVer & 0x80000000) && LOBYTE(LOWORD(dwVer)) >= 5)) ;
- else // not (Win98 or 2000)
- {
- int i;
- for(i = IDC_CHKCOLOR2; i <= IDC_CHOOSECOLBACK2; i++)
- EnableDlgItem(hDlg, i, FALSE);
- }
-
- //「Bold」「Italic」の設定
- CheckDlgButton(hDlg, IDC_BOLD,
- GetMyRegLong("", "Bold", FALSE));
- CheckDlgButton(hDlg, IDC_ITALIC,
- GetMyRegLong("", "Italic", FALSE));
-
- hfontb = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0);
- GetObject(hfontb, sizeof(LOGFONT), &logfont);
- logfont.lfWeight = FW_BOLD;
- hfontb = CreateFontIndirect(&logfont);
- SendDlgItemMessage(hDlg, IDC_BOLD, WM_SETFONT, (WPARAM)hfontb, 0);
-
- logfont.lfWeight = FW_NORMAL;
- logfont.lfItalic = 1;
- hfonti = CreateFontIndirect(&logfont);
- SendDlgItemMessage(hDlg, IDC_ITALIC, WM_SETFONT, (WPARAM)hfonti, 0);
-
- SendDlgItemMessage(hDlg, IDC_SPINCHEIGHT, UDM_SETRANGE, 0,
- MAKELONG(32, -32));
- SendDlgItemMessage(hDlg, IDC_SPINCHEIGHT, UDM_SETPOS, 0,
- (int)(short)GetMyRegLong("", "ClockHeight", 0));
- SendDlgItemMessage(hDlg, IDC_SPINCWIDTH, UDM_SETRANGE, 0,
- MAKELONG(32, -32));
- SendDlgItemMessage(hDlg, IDC_SPINCWIDTH, UDM_SETPOS, 0,
- (int)(short)GetMyRegLong("", "ClockWidth", 0));
- SendDlgItemMessage(hDlg, IDC_SPINVPOS, UDM_SETRANGE, 0,
- MAKELONG(32, -32));
- SendDlgItemMessage(hDlg, IDC_SPINVPOS, UDM_SETPOS, 0,
- (int)(short)GetMyRegLong("", "VertPos", 0));
- SendDlgItemMessage(hDlg, IDC_SPINLHEIGHT, UDM_SETRANGE, 0,
- MAKELONG(32, -32));
- SendDlgItemMessage(hDlg, IDC_SPINLHEIGHT, UDM_SETPOS, 0,
- (int)(short)GetMyRegLong("", "LineHeight", 0));
- }
-
- /*------------------------------------------------
- Apply
- --------------------------------------------------*/
- void OnApply(HWND hDlg)
- {
- DWORD dw;
- char s[80];
-
- //背景色の保存
- dw = CBGetItemData(hDlg, IDC_COLBACK, CBGetCurSel(hDlg, IDC_COLBACK));
- SetMyRegLong("", "BackColor", dw);
-
- SetMyRegLong("", "UseBackColor2",
- IsDlgButtonChecked(hDlg, IDC_CHKCOLOR2));
- dw = CBGetItemData(hDlg, IDC_COLBACK2, CBGetCurSel(hDlg, IDC_COLBACK2));
- SetMyRegLong("", "BackColor2", dw);
-
- //文字色の保存
- dw = CBGetItemData(hDlg, IDC_COLFORE, CBGetCurSel(hDlg, IDC_COLFORE));
- SetMyRegLong("", "ForeColor", dw);
-
- //フォント名の保存
- CBGetLBText(hDlg, IDC_FONT, CBGetCurSel(hDlg, IDC_FONT), s);
- SetMyRegStr("", "Font", s);
-
- //フォントサイズの保存
- if(CBGetCount(hDlg, IDC_FONTSIZE) > 0)
- {
- CBGetLBText(hDlg, IDC_FONTSIZE, CBGetCurSel(hDlg, IDC_FONTSIZE), s);
- SetMyRegLong("", "FontSize", atoi(s));
- }
- else SetMyRegLong("", "FontSize", 9);
-
- //「Bold」「Italic」の保存
- SetMyRegLong("", "Bold", IsDlgButtonChecked(hDlg, IDC_BOLD));
- SetMyRegLong("", "Italic", IsDlgButtonChecked(hDlg, IDC_ITALIC));
-
- SetMyRegLong("", "ClockHeight",
- SendDlgItemMessage(hDlg, IDC_SPINCHEIGHT, UDM_GETPOS, 0, 0));
- SetMyRegLong("", "ClockWidth",
- SendDlgItemMessage(hDlg, IDC_SPINCWIDTH, UDM_GETPOS, 0, 0));
- SetMyRegLong("", "VertPos",
- SendDlgItemMessage(hDlg, IDC_SPINVPOS, UDM_GETPOS, 0, 0));
- SetMyRegLong("", "LineHeight",
- SendDlgItemMessage(hDlg, IDC_SPINLHEIGHT, UDM_GETPOS, 0, 0));
- }
-
- /*------------------------------------------------
- 「色」コンボボックスの初期化
- --------------------------------------------------*/
- void InitColor(HWND hDlg)
- {
- COLORREF col;
- int i, j;
- WORD id;
- //Windowsデフォルト16色
- int rgb[16][3] = {{0,0,0}, {128,0,0}, {0,128,0}, {128,128,0},
- {0,0,128}, {128,0,128}, {0,128,128}, {192,192,192},
- {128,128,128}, {255,0,0}, {0,255,0}, {255,255,0},
- {0,0,255},{255,0,255}, {0,255,255}, {255,255,255}};
-
- for(i = 0; i < 3; i++)
- {
- if(i == 0) id = IDC_COLBACK;
- else if(i == 1) id = IDC_COLBACK2;
- else id = IDC_COLFORE;
-
- for(j = 0; j < 16; j++) //基本16色
- CBAddString(hDlg, id,
- RGB(rgb[j][0], rgb[j][1], rgb[j][2]));
- //ボタンの...色
- CBAddString(hDlg, id, 0x80000000|COLOR_3DFACE);
- CBAddString(hDlg, id, 0x80000000|COLOR_3DSHADOW);
- CBAddString(hDlg, id, 0x80000000|COLOR_3DHILIGHT);
- CBAddString(hDlg, id, 0x80000000|COLOR_BTNTEXT);
-
- //コンボボックスの色を選択
- if(i == 0)
- col = GetMyRegLong("", "BackColor",
- 0x80000000 | COLOR_3DFACE);
- else if(i == 1)
- col = GetMyRegLong("", "BackColor2", col);
- else
- col = GetMyRegLong("", "ForeColor",
- 0x80000000 | COLOR_BTNTEXT);
- for(j = 0; j < 20; j++)
- {
- if(col == (COLORREF)CBGetItemData(hDlg, id, j))
- break;
- }
- if(j == 20) //20色中にないとき
- CBAddString(hDlg, id, col);
- CBSetCurSel(hDlg, id, j);
- }
- }
-
- /*------------------------------------------------
- 「色」コンボボックスの高さの設定
- --------------------------------------------------*/
- void OnMeasureItemColorCombo(LPARAM lParam)
- {
- LPMEASUREITEMSTRUCT pmis;
-
- pmis = (LPMEASUREITEMSTRUCT)lParam;
- pmis->itemHeight = 7 * HIWORD(GetDialogBaseUnits()) / 8;
- }
-
- /*------------------------------------------------
- 「色」コンボボックスのオーナードロー
- --------------------------------------------------*/
- void OnDrawItemColorCombo(LPARAM lParam)
- {
- LPDRAWITEMSTRUCT pdis;
- HBRUSH hbr;
- COLORREF col;
- TEXTMETRIC tm;
- int y;
-
- pdis = (LPDRAWITEMSTRUCT)lParam;
-
- if(IsWindowEnabled(pdis->hwndItem))
- {
- col = pdis->itemData;
- if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
- }
- else col = col = GetSysColor(COLOR_3DFACE);
-
- switch(pdis->itemAction)
- {
- case ODA_DRAWENTIRE:
- case ODA_SELECT:
- {
- hbr = CreateSolidBrush(col);
- FillRect(pdis->hDC, &pdis->rcItem, hbr);
- DeleteObject(hbr);
-
- // print color names
- if(16 <= pdis->itemID && pdis->itemID <= 19)
- {
- char s[80];
-
- strcpy(s, MyString(IDS_BTNFACE + pdis->itemID - 16));
- SetBkMode(pdis->hDC, TRANSPARENT);
- GetTextMetrics(pdis->hDC, &tm);
- if(pdis->itemID == 19)
- SetTextColor(pdis->hDC, RGB(255,255,255));
- else
- SetTextColor(pdis->hDC, RGB(0,0,0));
- y = (pdis->rcItem.bottom - pdis->rcItem.top - tm.tmHeight)/2;
- TextOut(pdis->hDC, pdis->rcItem.left + 4, pdis->rcItem.top + y,
- s, strlen(s));
- }
- if(!(pdis->itemState & ODS_FOCUS)) break;
- }
- case ODA_FOCUS:
- {
- if(pdis->itemState & ODS_FOCUS)
- hbr = CreateSolidBrush(0);
- else
- hbr = CreateSolidBrush(col);
- FrameRect(pdis->hDC, &pdis->rcItem, hbr);
- DeleteObject(hbr);
- break;
- }
- }
- }
-
- /*------------------------------------------------
- enable/disable to use "background 2"
- --------------------------------------------------*/
- void OnCheckColor2(HWND hDlg)
- {
- BOOL b;
- b = IsDlgButtonChecked(hDlg, IDC_CHKCOLOR2);
- EnableDlgItem(hDlg, IDC_COLBACK2, b);
- EnableDlgItem(hDlg, IDC_CHOOSECOLBACK2, b);
- SendPSChanged(hDlg);
- }
-
- /*------------------------------------------------
- 色の選択 「...」ボタン
- --------------------------------------------------*/
- void OnChooseColor(HWND hDlg, WORD id)
- {
- CHOOSECOLOR cc;
- COLORREF col, colarray[16];
- WORD idCombo;
- int i;
-
- idCombo = id - 1;
-
- //最初に選ばれている色
- col = CBGetItemData(hDlg, idCombo, CBGetCurSel(hDlg, idCombo));
- if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
-
- for(i = 0; i < 16; i++) colarray[i] = RGB(255,255,255);
-
- memset(&cc, 0, sizeof(CHOOSECOLOR));
- cc.lStructSize = sizeof(CHOOSECOLOR);
- cc.hwndOwner = hDlg;
- cc.hInstance = g_hInst;
- cc.rgbResult = col;
- cc.lpCustColors = colarray;
- cc.Flags = CC_FULLOPEN | CC_RGBINIT;
-
- if(!ChooseColor(&cc)) return;
-
- for(i = 0; i < 16; i++)
- {
- if(cc.rgbResult == (COLORREF)CBGetItemData(hDlg, idCombo, i))
- break;
- }
- if(i == 16) //基本16色ではないとき
- {
- if(CBGetCount(hDlg, idCombo) == 20)
- CBAddString(hDlg, idCombo, cc.rgbResult);
- else
- CBSetItemData(hDlg, idCombo, 20, cc.rgbResult);
- i = 20;
- }
- CBSetCurSel(hDlg, idCombo, i);
-
- PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
- SendPSChanged(hDlg);
- }
-
- // 参考:Visual C++ 4.x のサンプルWORDPADのFORMATBA.CPP
-
- BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf,
- NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo);
- BOOL CALLBACK EnumSizeProcEx(ENUMLOGFONTEX* pelf,
- NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo);
- int nFontSizes[] =
- {8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72};
- int logpixelsy;
-
- /*------------------------------------------------
- Initialization of "Font" combo box
- --------------------------------------------------*/
- void InitComboFont(HWND hDlg)
- {
- HDC hdc;
- LOGFONT lf;
- HWND hcombo;
- char s[80];
- int i;
-
- hdc = GetDC(NULL);
-
- // Enumerate fonts and set in the combo box
- memset(&lf, 0, sizeof(LOGFONT));
- hcombo = GetDlgItem(hDlg, IDC_FONT);
- lf.lfCharSet = GetTextCharset(hdc); // MS UI Gothic, ...
- EnumFontFamiliesEx(hdc, &lf,
- (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
- lf.lfCharSet = OEM_CHARSET; // Small Fonts, Terminal...
- EnumFontFamiliesEx(hdc, &lf,
- (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
- lf.lfCharSet = DEFAULT_CHARSET; // Arial, Courier, Times New Roman, ...
- EnumFontFamiliesEx(hdc, &lf,
- (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hcombo, 0);
- ReleaseDC(NULL, hdc);
-
- GetMyRegStr("", "Font", s, 80, "");
- if(s[0] == 0)
- {
- HFONT hfont;
- hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
- if(hfont)
- {
- GetObject(hfont, sizeof(lf),(LPVOID)&lf);
- strcpy(s, lf.lfFaceName);
- }
- }
- i = CBFindStringExact(hDlg, IDC_FONT, s);
- if(i == LB_ERR) i = 0;
- CBSetCurSel(hDlg, IDC_FONT, i);
- }
-
- /*------------------------------------------------
- 「フォントサイズ」コンボボックスの設定
- --------------------------------------------------*/
- void SetComboFontSize(HWND hDlg, BOOL bInit)
- {
- HDC hdc;
- char s[160];
- DWORD size;
- LOGFONT lf;
- int i;
-
- //以前のsizeを保存
- if(bInit) // WM_INITDIALOGのとき
- {
- size = GetMyRegLong("", "FontSize", 9);
- if(size == 0) size = 9;
- }
- else // IDC_FONTが変更されたとき
- {
- CBGetLBText(hDlg, IDC_FONTSIZE,
- CBGetCurSel(hDlg, IDC_FONTSIZE), (LPARAM)s);
- size = atoi(s);
- }
-
- CBResetContent(hDlg, IDC_FONTSIZE);
-
- hdc = GetDC(NULL);
- logpixelsy = GetDeviceCaps(hdc, LOGPIXELSY);
-
- // s = フォント名
- CBGetLBText(hDlg, IDC_FONT, CBGetCurSel(hDlg, IDC_FONT), (LPARAM)s);
-
- //フォントのサイズを列挙してコンボボックスに入れる
- memset(&lf, 0, sizeof(LOGFONT));
- strcpy(lf.lfFaceName, s);
- lf.lfCharSet = (BYTE)CBGetItemData(hDlg, IDC_FONT, CBGetCurSel(hDlg, IDC_FONT));
- EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumSizeProcEx,
- (LPARAM)GetDlgItem(hDlg, IDC_FONTSIZE), 0);
-
- //EnumFontFamilies(hdc, s,
- // (FONTENUMPROC)EnumSizeProc, (LPARAM)GetDlgItem(hDlg, IDC_FONTSIZE));
-
- ReleaseDC(NULL, hdc);
-
- // sizeに近いものを選択
- for(; size > 0; size--)
- {
- wsprintf(s, "%d", size);
- i = CBFindStringExact(hDlg, IDC_FONTSIZE, s);
- if(i != LB_ERR)
- {
- CBSetCurSel(hDlg, IDC_FONTSIZE, i); return;
- }
- }
- CBSetCurSel(hDlg, IDC_FONTSIZE, 0);
- }
-
- /*------------------------------------------------
- Callback function for enumerating fonts.
- To set a font name in the combo box.
- --------------------------------------------------*/
- BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf,
- NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo)
- {
- // if(FontType & RASTER_FONTTYPE) return 1;
- if(pelf->elfLogFont.lfFaceName[0] != '@' &&
- SendMessage((HWND)hCombo, CB_FINDSTRINGEXACT, 0,
- (LPARAM)pelf->elfLogFont.lfFaceName) == LB_ERR)
- {
- int index;
- index = SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)pelf->elfLogFont.lfFaceName);
- if(index >= 0)
- SendMessage((HWND)hCombo, CB_SETITEMDATA,
- index, (LPARAM)pelf->elfLogFont.lfCharSet);
- }
- return 1;
- }
-
- /*------------------------------------------------
- フォントの列挙コールバック
- コンボボックスにフォントサイズを入れる
- --------------------------------------------------*/
- BOOL CALLBACK EnumSizeProcEx(ENUMLOGFONTEX* pelf,
- NEWTEXTMETRICEX* lpntm, int FontType, LPARAM hCombo)
- {
- char s[80];
- int num, i, count;
-
- //トゥルータイプフォントまたは、
- //トゥルータイプでもラスタフォントでもない場合
- if((FontType & TRUETYPE_FONTTYPE) ||
- !( (FontType & TRUETYPE_FONTTYPE) || (FontType & RASTER_FONTTYPE) ))
- {
- // nFontSizesの数字をそのまま入れる
- for (i = 0; i < 16; i++)
- {
- wsprintf(s, "%d", nFontSizes[i]);
- SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)s);
- }
- return FALSE;
- }
-
- //それ以外の場合、1つ1つ数字を入れていく
- num = (lpntm->ntmTm.tmHeight - lpntm->ntmTm.tmInternalLeading) * 72 / logpixelsy;
- count = SendMessage((HWND)hCombo, CB_GETCOUNT, 0, 0);
- for(i = 0; i < count; i++)
- {
- SendMessage((HWND)hCombo, CB_GETLBTEXT, i, (LPARAM)s);
- if(num == atoi(s)) return TRUE;
- else if(num < atoi(s))
- {
- wsprintf(s, "%d", num);
- SendMessage((HWND)hCombo, CB_INSERTSTRING, i, (LPARAM)s);
- return TRUE;
- }
- }
- wsprintf(s, "%d", num);
- SendMessage((HWND)hCombo, CB_ADDSTRING, 0, (LPARAM)s);
- return TRUE;
- }
-
-