ダイアログウィンドウ
ダイアログアプリケーション
通常のアプリケーションのウィンドウはクライアント領域を持つ
これまで作ってきたウィンドウですが、そうではないプログラムもあります
Windows デフォルトで装備している Microsoft の CALC.EXE などです
CALC.EXE はすなわち電卓プログラムですが
このプログラムは、ウィンドウがダイアログのように作られています
これは実際に可能で、アプリケーションのトップレベルのウィンドウも
CreateWindow() ではなく CreateDialog() を用いて作ることもできるのです
ダイアログはこれまで同様に、リソースで表現します
しかし、DIALOG 文の中に CLASS パラメータを指定する必要があります
CLASS class
class には、有効なクラスの名前を " で囲んで指定します
これが、トップレベルのダイアログアプリケーションの特徴です
ここで指定するのは、プログラム側で定義した有効なウィンドウクラスです
こうすることで、このダイアログボックスは
指定したウィンドウクラスの性質を持つようになります
背景色、アイコン、カーソルなどの設定はウィンドウクラスのものになります
ただし、CreateDialog() で表示するウィンドウクラスの場合
cbWndExtra メンバの値は DLGWINDOWEXTRA を指定しなければいけません
プロシージャは、ウィンドウクラスで指定されているプロシージャが実行されます
そのため、CreateDialog() 関数の第4引数は NULL を指定することになります
また、親ウィンドウを指定する第3引数も 0 になるということは理解できるでしょう
//リソーススクリプト
KITTY DIALOG 10 , 10 , 100 , 50
FONT 12 , "MS ゴシック"
STYLE WS_VISIBLE | WS_POPUPWINDOW
CLASS "KITTY"
CAPTION "Magical nyan nyan TARUTO" {
PUSHBUTTON "OK" , IDOK , 40 , 30 , 20 , 10
}
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDOK:
SendMessage(hwnd , WM_CLOSE , 0 , 0);
}
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
HACCEL haccel;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = 0;
winc.cbWndExtra = DLGWINDOWEXTRA;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)CreateSolidBrush(GetSysColor(COLOR_MENU));
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateDialog(hInstance , TEXT("KITTY") , 0 , NULL);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
これが、リソーススクリプトのダイアログテンプレートから
CreateDialog() 関数を用いて作ったアプリケーションウィンドウです
このウィンドウのアイコンなどはアプリケーションのものになっています