ウィンドウの作成
この記事では、ウィンドウを作成して表示する方法について説明します。
ウィンドウ クラス
ウィンドウ クラスは、複数のウィンドウに共通する一連の動作を定義します。 たとえば、ボタンのグループでは、ユーザーがボタンを選択すると、各ボタンの動作が似ています。 もちろん、ボタンはまったく同じではありません。 各ボタンは、独自のテキスト文字列を表示し、独自の画面座標を持っています。 各ウィンドウに固有のデータは、 インスタンス データと呼ばれます。
プログラムがそのクラスのインスタンスを 1 つだけ作成する場合でも、すべてのウィンドウをウィンドウ クラスに関連付ける必要があります。 ウィンドウ クラスは、C++ の意味ではクラスではありません。 むしろ、オペレーティング システムによって内部的に使用されるデータ構造です。 ウィンドウ クラスは、実行時にシステムに登録されます。 新しいウィンドウ クラスを登録するには、 WNDCLASS 構造体を入力します。
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
次の構造体メンバーを設定する必要があります。
- lpfnWndProc は、 ウィンドウ プロシージャまたはウィンドウ プロシージャ と呼ばれるアプリケーション定義関数へのポインター です。 ウィンドウ プロシージャは、ウィンドウのほとんどの動作を定義します。 現時点では、この値は関数の前方宣言です。 詳細については、「 ウィンドウの作成」の手順に関するページを参照してください。
-
hInstance は、アプリケーション インスタンスへのハンドルです。 の hInstance パラメーターからこの値を
wWinMain
取得します。 - lpszClassName は、ウィンドウ クラスを識別する文字列です。
クラス名は現在のプロセスに対してローカルであるため、名前はプロセス内で一意である必要があります。 ただし、標準の Windows コントロールにはクラスもあります。 これらのコントロールのいずれかを使用する場合は、コントロール クラス名と競合しないクラス名を選択する必要があります。 たとえば、ボタン コントロールのウィンドウ クラスの名前は Button です。
WNDCLASS 構造体には、ここには示されていない他のメンバーがあります。 この例に示すように、0 に設定することも、入力することもできます。 詳細については、「 WNDCLASS」を参照してください。
次に、 WNDCLASS 構造体のアドレスを RegisterClass 関数に渡します。 この関数は、ウィンドウ クラスをオペレーティング システムに登録します。
RegisterClass(&wc);
ウィンドウを作成する
ウィンドウの新しいインスタンスを作成するには、 CreateWindowEx 関数を呼び出します。
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
パラメーターの詳細な説明については、「 CreateWindowEx」を参照してください。 簡単な概要を次に示します。
- 最初のパラメーターを使用すると、ウィンドウに対していくつかのオプションの動作 (透明ウィンドウなど) を指定できます。 既定の動作では、このパラメーターを 0 に設定します。
-
CLASS_NAME
はウィンドウ クラスの名前です。 この名前は、作成するウィンドウの種類を定義します。 - ウィンドウ テキストは、さまざまな種類のウィンドウでさまざまな方法で使用されます。 ウィンドウにタイトル バーがある場合は、タイトル バーにテキストが表示されます。
- ウィンドウ スタイルは、ウィンドウの外観の一部を定義するフラグのセットです。 定数 WS_OVERLAPPEDWINDOW は、実際にはビットごとの
OR
と組み合わされた複数のフラグです。 これらのフラグを組み合わせると、ウィンドウにタイトル バー、罫線、システム メニュー 、最小化ボタン と 最大化 ボタンが表示されます。 このフラグのセットは、最上位レベルのアプリケーション ウィンドウで最も一般的なスタイルです。 - 位置とサイズの場合、定数 CW_USEDEFAULT は既定値を使用することを意味します。
- 次のパラメーターは、新しいウィンドウの親ウィンドウまたは所有者ウィンドウを設定します。 子ウィンドウを作成する場合は、親を設定します。 最上位ウィンドウの場合は、この値を に
NULL
設定します。 - アプリケーション ウィンドウの場合、次のパラメーターはウィンドウのメニューを定義します。 この例ではメニューを使用しないため、値は です
NULL
。 - hInstance は、前に説明したインスタンス ハンドルです。 「WinMain: アプリケーション エントリ ポイント」を参照してください。
- 最後のパラメーターは、 型
void*
の任意のデータへのポインターです。 この値を使用して、データ構造をウィンドウ プロシージャに渡すことができます。 このパラメーターを使用する 1 つの方法については、「 アプリケーション状態の管理」を参照してください。
CreateWindowEx は 、新しいウィンドウへのハンドルを返します。関数が失敗した場合は 0 を返します。 ウィンドウを表示するには、ウィンドウを表示するには、ウィンドウ ハンドルを ShowWindow 関数に渡します。
ShowWindow(hwnd, nCmdShow);
hwnd パラメーターは、CreateWindowEx によって返されるウィンドウ ハンドルです。 nCmdShow パラメーターは、ウィンドウを最小化または最大化するために使用できます。 オペレーティング システムは 、wWinMain 関数を介してこの値をプログラムに渡します。
ウィンドウを作成するための完全なコードを次に示します。 WindowProc はまだ関数の前方宣言であることに注意してください。
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
これでウィンドウが作成されました。
現時点では、ウィンドウにはコンテンツが含まれていないか、ユーザーと対話しません。 実際の GUI アプリケーションでは、ウィンドウはユーザーとオペレーティング システムからのイベントに応答します。 次のセクションでは、ウィンドウ メッセージがこの種の対話機能を提供する方法について説明します。
関連項目
[ウィンドウ メッセージ] に進み、このモジュールを続行します。