ウインドウの表示

WinMain関数 - インコのWindowsSDK を修正して、ウインドウを表示するようにします。

流れ

1.WinMain()の中で、今回新たに作成する作成するInitInstance()を呼び出します。

2.CreateWindow()で、ウインドウを作成します。

HWND CreateWindow(
    LPCTSTR lpClassName,  // 登録されているクラス名
    LPCTSTR lpWindowName, // タイトルバーに表示する文字列
    DWORD dwStyle,        // ウインドウスタイル
    int x,                // ウインドウ左上のX座標
    int y,                // ウインドウ左上のY座標
    int nWidth,           // ウインドウの幅
    int nHeight,          // ウインドウの高さ
    HWND hWndParent,      // オーナー(親)ウィンドウのハンドル
    HMENU hMenu,          // メニューのハンドルまたは子のID(識別子)
    HINSTANCE hInstance,  // アプリケーションインスタンスのハンドル
    LPVOID lpParam        // ウィンドウ作成データ
);

引数の簡単な説明

引数 意味 解説
lpClassName 登録されているクラス名 TEXT("STATIC")とします。
lpWindowName タイトルバーに表示する文字列 文字セットをunicodeでコンパイルする場合は、テキストを必ず、TEXT("")で囲ってください。
dwStyle ウインドウスタイル 通常のウインドウを作成するWS_OVERLAPPEDWINDOWを指定します。
DWORD型は、32ビット符号なし整数型です。
x, y, nWidth, nHeight ウインドウの位置、サイズ CW_USEDEFAULTを指定すると自動設定になります。
hWndParent オーナー(親)ウィンドウのハンドル オーナーウィンドウがないのでNULL
hMenu メニューのハンドルまたは子のID(識別子) メニューを付けないのでNULL
hInstance アプリケーションインスタンスのハンドル
lpParam ウィンドウ作成データ ここではNULL

この関数の戻り値は、HWND型です。HWND型とは、ウィンドウハンドルを表すポインタ型変数です。

引数の詳しい説明は、 CreateWindowEx() で解説します。

3.CreateWindow()が成功したら、ShowWindow()でウインドウを表示します。

BOOL ShowWindow(
    HWND hWnd,     // ウィンドウハンドル
    int nCmdShow   // 表示状態
);

今回のように、アプリケーションが最初に呼び出す引数ShowWindow()の場合、 nCmdShowは、必ずWinMain()のnCmdShowパラメータを指定してください。

4.UpdateWindow()でウインドウを更新します。

BOOL UpdateWindow(
    HWND hWnd,     // ウィンドウハンドル
);

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>

// このコード モジュールに含まれる関数の宣言を転送します:
BOOL InitInstance(HINSTANCE, int);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,
                     int nCmdShow)
{
    // アプリケーションの初期化を実行します:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    return 0;
}

//
//   関数: InitInstance(HINSTANCE, int)
//
//   目的: メイン ウィンドウを作成します。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hWnd = CreateWindow(TEXT("STATIC"), TEXT("HP"), WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

実行すると分かると思いますが、一瞬だけウインドウが表示された後、すぐにウインドウが閉じてしまいます。
これは、WinMain() が最後の return 0; まで来る事により、アプリケーションが終了するためです。
通常のアプリケーションでは、ユーザーが終了の処理をしない限り、WinMain() の最後まで行かないようにしています。これは、次回以降で説明します。