テンプレート
ダイアログテンプレート
コモンダイアログボックスは、フック関数を使って拡張可能ですが
この他に、ダイアログテンプレートを用いて外観を変更させる方法があります
フック関数でも CreateWindow() 等を用いて、外観を変更させることは可能ですが
大幅な変更が必要な場合は、ダイアログテンプレートを用いた方がわかりやすいでしょう
ダイアログテンプレートは、コモンダイアログを作成するのための構造体の
hInstance メンバにリソースが格納されているモジュールを指定し
lpTemplateName メンバに、代わりに用いるダイアログリソースの識別子を指定します
では、どのような仕様でテンプレートを作れば良いのでしょうか?
ダイアログプロシージャが正常に処理するためには、標準のテンプレートに合わせて
それと同じ ID を用いたりしなければ、プログラムは正しく動作しないでしょう
基本的に、コモンダイアログには、OK ボタンは IDOK を使い
キャンセルボタンは IDCANCEL 識別子を用いるなどの、一貫した習性があります
しかし、厳密には、そのダイアログのリソーススクリプトを見るほかにありません
//resource.h
#define DLG_COLOR 10
#define KITTY_BUTTON 11
#define COLOR_HUESCROLL 700
#define COLOR_SATSCROLL 701
#define COLOR_LUMSCROLL 702
#define COLOR_HUE 703
#define COLOR_SAT 704
#define COLOR_LUM 705
#define COLOR_RED 706
#define COLOR_GREEN 707
#define COLOR_BLUE 708
#define COLOR_CURRENT 709
#define COLOR_RAINBOW 710
#define COLOR_SAVE 711
#define COLOR_ADD 712
#define COLOR_SOLID 713
#define COLOR_TUNE 714
#define COLOR_SCHEMES 715
#define COLOR_ELEMENT 716
#define COLOR_SAMPLES 717
#define COLOR_PALETTE 718
#define COLOR_MIX 719
#define COLOR_BOX1 720
#define COLOR_CUSTOM1 721
#define COLOR_HUEACCEL 723
#define COLOR_SATACCEL 724
#define COLOR_LUMACCEL 725
#define COLOR_REDACCEL 726
#define COLOR_GREENACCEL 727
#define COLOR_BLUEACCEL 728
#define COLOR_SOLID_LEFT 730
#define COLOR_SOLID_RIGHT 731
#define NUM_BASIC_COLORS 48
#define NUM_CUSTOM_COLORS 16
//リソーススクリプト
#include "resource.h"
KITTY_ChooseColor DIALOG LOADONCALL MOVEABLE DISCARDABLE 2, 0, 298, 184
STYLE WS_BORDER | DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU |
DS_3DLOOK | DS_CONTEXTHELP
CAPTION "Color"
FONT 8 "MS Shell Dlg" {
LTEXT "&Basic colors:", -1, 4, 4, 140, 9
CONTROL "", COLOR_BOX1, "static",
SS_SIMPLE | WS_CHILD | WS_TABSTOP | WS_GROUP,
4, 14, 140, 86
LTEXT "&Custom colors:", -1, 4, 106, 140, 9
CONTROL "", COLOR_CUSTOM1, "static",
SS_SIMPLE | WS_CHILD | WS_TABSTOP | WS_GROUP,
4, 116, 140, 28
PUSHBUTTON "&Define Custom Colors >>" COLOR_MIX, 4, 150, 140, 14,
WS_TABSTOP | WS_GROUP
DEFPUSHBUTTON "OK", IDOK, 4, 166, 44, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Cancel", IDCANCEL, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Kitty" , KITTY_BUTTON ,
100 , 166 , 44 , 14 , WS_GROUP | WS_TABSTOP
CONTROL "", COLOR_RAINBOW, "static",
SS_SUNKEN | SS_SIMPLE | WS_CHILD, 152, 4, 118, 116
CONTROL "", COLOR_LUMSCROLL, "static",
SS_SUNKEN | SS_SIMPLE | WS_CHILD, 280, 4, 8, 116
CONTROL "", COLOR_CURRENT, "static",
SS_SUNKEN | SS_SIMPLE | WS_CHILD, 152, 124, 40, 26
PUSHBUTTON "&o", COLOR_SOLID, 300, 200, 4, 14, WS_GROUP
RTEXT "Color", COLOR_SOLID_LEFT, 152, 151, 20, 9
LTEXT "|S&olid", COLOR_SOLID_RIGHT, 172, 151, 20, 9
RTEXT "Hu&e:", COLOR_HUEACCEL, 194, 126, 20, 9
EDITTEXT, COLOR_HUE, 216, 124, 18, 12, WS_GROUP | WS_TABSTOP
RTEXT "&Sat:", COLOR_SATACCEL, 194, 140, 20, 9
EDITTEXT, COLOR_SAT, 216, 138, 18, 12, WS_GROUP | WS_TABSTOP
RTEXT "&Lum:", COLOR_LUMACCEL, 194, 154, 20, 9
EDITTEXT, COLOR_LUM, 216, 152, 18, 12, WS_GROUP | WS_TABSTOP
RTEXT "&Red:", COLOR_REDACCEL, 243, 126, 24, 9
EDITTEXT, COLOR_RED, 269, 124, 18, 12, WS_GROUP | WS_TABSTOP
RTEXT "&Green:", COLOR_GREENACCEL, 243, 140, 24, 9
EDITTEXT, COLOR_GREEN, 269, 138, 18, 12, WS_GROUP | WS_TABSTOP
RTEXT "Bl&ue:", COLOR_BLUEACCEL, 243, 154, 24, 9
EDITTEXT, COLOR_BLUE, 269, 152, 18, 12, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Add to Custom Colors", COLOR_ADD, 152, 166, 142, 14,
WS_GROUP | WS_TABSTOP
}
#include <windows.h>
#include "resource.h"
UINT CALLBACK CCHookProc(HWND hdlg , UINT uiMsg , WPARAM wp , LPARAM lp) {
switch(uiMsg) {
case WM_INITDIALOG:
SetWindowText(hdlg , TEXT("Kitty on your lap"));
return TRUE;
case WM_COMMAND:
if (LOWORD(wp) == KITTY_BUTTON) {
MessageBox(hdlg ,
TEXT("Kitty on your lap!") , NULL , MB_OK);
return TRUE;
}
}
return FALSE;
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
static CHOOSECOLOR cc = {0};
static COLORREF color = 0 , CustColors[16];
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
cc.lStructSize = sizeof (CHOOSECOLOR);
cc.hwndOwner = hWnd;
cc.hInstance = (HWND)((LPCREATESTRUCT)(lp))->hInstance;
cc.rgbResult = color;
cc.lpCustColors = CustColors;
cc.Flags = CC_RGBINIT |
CC_ENABLEHOOK | CC_ENABLETEMPLATE;
cc.lpfnHook = CCHookProc;
cc.lpTemplateName = TEXT("KITTY_ChooseColor");
return 0;
case WM_LBUTTONUP:
if (!ChooseColor(&cc)) return 0;
SetClassLong(hWnd , GCL_HBRBACKGROUND ,
(LONG)CreateSolidBrush(cc.rgbResult));
InvalidateRect(hWnd , NULL , TRUE);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
これは、今回作成した独自のダイアログテンプレートです
標準のテンプレートに従いながらも、一部のコントロールなどを変更して拡張しています
下部の "Kitty" ボタンは、今回勝手にとりつけた新しいボタンです
標準のコモンダイアログは、*.DLG という拡張子のリソースファイルで
開発環境の中に存在しているはずなので、探して見てみると良いでしょう