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() の最後まで行かないようにしています。これは、次回以降で説明します。