Window の生成と終了の雛形

前回 は Window の生成を行うプログラムを作りましたが、メッセージボックスの OK ボタンを押すとすぐに終了するようなプログラムでした。

今回は 標準 Windows API さんの 9. ~ 14. までの内容を踏まえて、Window の生成と終了の雛形を書きました。

Source Code

#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;

}

Sample

一応 sample の実行ファイルを置いておきます。 ウィルスとかありませんけど怖い人は開けないように。

win32_2.exe

参考サイト


'08.08.03 新規作成.