テンプレート


ダイアログテンプレート

コモンダイアログボックスは、フック関数を使って拡張可能ですが
この他に、ダイアログテンプレートを用いて外観を変更させる方法があります
フック関数でも 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 という拡張子のリソースファイルで
開発環境の中に存在しているはずなので、探して見てみると良いでしょう



前のページへ戻る次のページへ