前回 は Window の生成を行うプログラムを作りましたが、メッセージボックスの OK ボタンを押すとすぐに終了するようなプログラムでした。
今回は 標準 Windows API さんの 9. ~ 14. までの内容を踏まえて、Window の生成と終了の雛形を書きました。
#include <windows.h>
#include <stdlib.h>
/**
* Window プロシージャ
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
/*===========================================
変数定義
===========================================*/
LPCREATESTRUCT lpcsWnd;
/*===========================================
処理
===========================================*/
switch(msg) {
case WM_DESTROY: // DestroyWindow() が投げる Message
// 終了時にメッセージボックスを表示
MessageBox(hwnd, TEXT("終了します. "), TEXT("information"), MB_ICONINFORMATION);
PostQuitMessage(0);
return 0;
case WM_CREATE: // CreateWindow() が投げる Message
lpcsWnd = (LPCREATESTRUCT) lp;
if( MessageBox(hwnd, TEXT("Window を生成しますか? "), TEXT(lpcsWnd->lpszName), MB_YESNO | MB_ICONQUESTION)
== IDYES ) {
return 0; // CreateWindow() に 0 を返すと Window 生成する
}
else {
PostQuitMessage(0);
return -1; // CreateWindow() に -1 を返すと Window を生成しない
}
}
return DefWindowProc(hwnd, msg, wp, lp);
}
/**
* WinMain 関数
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
/*===========================================
変数定義
===========================================*/
HWND hwnd;
WNDCLASS winc;
MSG msg;
/*===========================================
Window Class
===========================================*/
// Window スタイルの指定
winc.style = CS_HREDRAW | CS_VREDRAW;
// Window プロシージャの指定
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(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("TEST_WINDOW");
// Window Class の登録
if(!RegisterClass(&winc)) {
return 0; // 失敗時終了
}
/*===========================================
Window 生成
===========================================*/
hwnd = CreateWindow(
TEXT("TEST_WINDOW"), TEXT("test window!"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, // Window の位置
CW_USEDEFAULT, CW_USEDEFAULT, // Window のサイズ
NULL, NULL,
hInstance, NULL
);
if(hwnd == NULL){
return 0; // 失敗時終了
}
/*===========================================
処理
===========================================*/
// Message を取得し、処理する
while(GetMessage(&msg, NULL, 0, 0)) {
DispatchMessage(&msg);
}
// 終了
return msg.wParam;
}