バージョン情報
このトピックでは、アプリケーションがウィンドウを作成して使用するために使用するプログラミング要素について説明します。ウィンドウ間の関係を管理する。ウィンドウのサイズ、移動、表示を行います。
概要には、次のトピックが含まれています。
デスクトップ ウィンドウ
システムを起動すると、デスクトップ ウィンドウが自動的に作成されます。 デスクトップ ウィンドウは、画面の背景を描画し、すべてのアプリケーションによって表示されるすべてのウィンドウのベースとして機能するシステム定義のウィンドウです。
デスクトップ ウィンドウでは、ビットマップを使用して画面の背景を描画します。 ビットマップによって作成されるパターンは、 デスクトップ 壁紙と呼ばれます。 既定では、デスクトップ ウィンドウは、レジストリで指定された.bmp ファイルのビットマップをデスクトップの壁紙として使用します。
GetDesktopWindow 関数は、デスクトップ ウィンドウへのハンドルを返します。
コントロール パネル項目などのシステム構成アプリケーションでは、wAction パラメーターを SPI_SETDESKWALLPAPER に設定した SystemParametersInfo 関数と、ビットマップ ファイル名を指定する lpvParam パラメーターを使用して、デスクトップの壁紙を変更します。 次に、SystemParametersInfo は、指定したファイルからビットマップを読み込み、ビットマップを使用して画面の背景を描画し、レジストリに新しいファイル名を入力します。
アプリケーション ウィンドウ
すべてのグラフィカル Windows ベースのアプリケーションは、ユーザーとアプリケーションの間のプライマリ インターフェイスとして機能する、メイン ウィンドウと呼ばれる少なくとも 1 つのウィンドウを作成します。 また、ほとんどのアプリケーションは、直接または間接的に他のウィンドウを作成して、メイン ウィンドウに関連するタスクを実行します。 各ウィンドウは、出力を表示し、ユーザーからの入力を受信する役割を果たします。
アプリケーションを起動すると、タスク バー ボタンもアプリケーションに関連付けられます。 タスク バー ボタンには、プログラム アイコンとタイトルが含まれています。 アプリケーションがアクティブになると、タスク バー ボタンがプッシュ状態で表示されます。
アプリケーション ウィンドウには、タイトル バー、メニュー バー、ウィンドウ メニュー (旧称システム メニュー)、最小化ボタン、最大化ボタン、復元ボタン、閉じるボタン、サイズ設定の境界線、クライアント領域、水平スクロール バー、垂直スクロール バーなどの要素が含まれます。 アプリケーションのメイン ウィンドウには、通常、これらのコンポーネントがすべて含まれます。 次の図は、一般的なメイン ウィンドウでこれらのコンポーネントを示しています。
クライアント領域
クライアント領域は、アプリケーションがテキストやグラフィックスなどの出力を表示するウィンドウの一部です。 たとえば、デスクトップ発行アプリケーションでは、ドキュメントの現在のページがクライアント領域に表示されます。 アプリケーションは、ウィンドウへの入力を処理し、クライアント領域に出力を表示するために、ウィンドウ プロシージャと呼ばれる関数を提供する必要があります。 詳細については、「 ウィンドウ プロシージャ」を参照してください。
非クライアント領域
タイトル バー、メニュー バー、ウィンドウ メニュー、最小化と最大化ボタン、サイズ変更罫線、スクロール バーは、ウィンドウの 非クライアント領域と総称されます。 システムは、非クライアント領域のほとんどの側面を管理します。アプリケーションは、クライアント領域の外観と動作を管理します。
タイトル バーには、アプリケーション定義のアイコンとテキスト行が表示されます。通常、テキストはアプリケーションの名前を指定するか、ウィンドウの目的を示します。 アプリケーションは、ウィンドウの作成時にアイコンとテキストを指定します。 タイトル バーを使用すると、ユーザーはマウスやその他のポインティング デバイスを使用してウィンドウを移動することもできます。
ほとんどのアプリケーションには、アプリケーションでサポートされているコマンドを一覧表示する メニュー バー が含まれています。 メニュー バーの項目は、コマンドのメインカテゴリを表します。 通常、メニュー バーの項目をクリックするとポップアップ メニューが開き、その項目は特定のカテゴリ内のタスクに対応します。 コマンドをクリックすると、ユーザーはアプリケーションにタスクの実行を指示します。
ウィンドウ メニューは、システムによって作成および管理されます。 これには、ユーザーが選択した場合、ウィンドウのサイズまたは位置の設定、アプリケーションの閉じ、またはタスクの実行を行う標準のメニュー項目セットが含まれています。 詳細については、「 メニュー」を参照してください。
右上隅のボタンは、ウィンドウのサイズと位置に影響します。 最大化ボタンをクリックすると、ウィンドウが画面のサイズに拡大され、ウィンドウが配置されるため、デスクトップ全体からタスク バーを引いた位置までカバーされます。 同時に、システムは最大化ボタンを復元ボタンに置き換えます。 復元ボタンをクリックすると、ウィンドウが以前のサイズと位置に復元されます。 最小化ボタンをクリックすると、ウィンドウがタスク バー ボタンのサイズに縮小され、タスク バー ボタンの上にウィンドウが配置され、タスク バー ボタンが通常の状態で表示されます。 アプリケーションを以前のサイズと位置に復元するには、タスク バー ボタンをクリックします。 閉じるボタンをクリックすると、アプリケーションが終了します。
サイズ設定の境界線は、ユーザーがマウスやその他のポインティング デバイスを使用してウィンドウのサイズを変更できるようにする、ウィンドウの周囲の領域です。
水平スクロール バーと垂直スクロール バーは、マウスまたはキーボード入力を、アプリケーションがクライアント領域の内容を水平方向または垂直方向にシフトするために使用する値に変換します。 たとえば、長いドキュメントを表示するワープロ アプリケーションでは、通常、ユーザーがドキュメントを上下にページングできるように垂直スクロール バーが提供されます。
コントロールとダイアログ ボックス
アプリケーションでは、コントロールやダイアログ ボックスなど、メイン ウィンドウに加えて、いくつかの種類のウィンドウを作成できます。
コントロールは、開くファイルの名前やテキスト選択の目的のポイント サイズなど、アプリケーションがユーザーから特定の情報を取得するために使用するウィンドウです。 アプリケーションでは、コントロールを使用して、アプリケーションの特定の機能を制御するために必要な情報を取得することもできます。 たとえば、通常、ワープロ アプリケーションでは、ユーザーが単語の折り返しをオンまたはオフにできるようにするコントロールが提供されます。 詳細については、「 Windows コントロール」を参照してください。
コントロールは、常に別のウィンドウ (通常はダイアログ ボックス) と組み合わせて使用されます。 ダイアログ ボックスは、1 つ以上のコントロールを含むウィンドウです。 アプリケーションでは、ダイアログ ボックスを使用して、コマンドを完了するために必要な入力をユーザーに求めます。 たとえば、ファイルを開くコマンドを含むアプリケーションでは、ユーザーがパスとファイル名を指定するコントロールを含むダイアログ ボックスが表示されます。 ダイアログ ボックスでは、通常、メイン ウィンドウと同じウィンドウ コンポーネントのセットは使用されません。 ほとんどの場合、タイトル バー、ウィンドウ メニュー、境界線 (サイズ変更なし)、クライアント領域がありますが、通常、メニュー バー、最小化ボタンと最大化ボタン、スクロール バーはありません。 詳細については、「 ダイアログ ボックス」を参照してください。
メッセージ ボックスは、ユーザーにメモ、注意、または警告を表示する特別なダイアログ ボックスです。 たとえば、メッセージ ボックスは、タスクの実行中にアプリケーションで発生した問題をユーザーに通知できます。 詳細については、「 メッセージ ボックス」を参照してください。
ウィンドウ属性
アプリケーションは、ウィンドウの作成時に次の情報を提供する必要があります。 (新しいウィンドウを一意に識別するために作成関数が返す ウィンドウ ハンドルを除きます)。
- クラス名
- ウィンドウの名前
- ウィンドウ スタイル
- 拡張ウィンドウ スタイル
- Position
- [サイズ]
- 親または所有者ウィンドウ ハンドル
- メニュー ハンドルまたはChild-Window識別子
- アプリケーション インスタンス ハンドル
- 作成データ
- ウィンドウ ハンドル
これらのウィンドウ属性については、次のセクションで説明します。
Class Name (クラス名)
すべてのウィンドウはウィンドウ クラスに属します。 アプリケーションでは、そのクラスのウィンドウを作成する前に、ウィンドウ クラスを登録する必要があります。 ウィンドウ クラスは、ウィンドウの外観と動作のほとんどの側面を定義します。 ウィンドウ クラスの主なコンポーネントは 、ウィンドウ プロシージャです。これは、ウィンドウに送信されたすべての入力と要求を受信して処理する関数です。 システムは、メッセージの形式で入力と要求を提供 します。 詳細については、「 ウィンドウ クラス」、「 ウィンドウ プロシージャ」、「 メッセージおよびメッセージ キュー」を参照してください。
ウィンドウの名前
ウィンドウ名は、ユーザーのウィンドウを識別するテキスト文字列です。 通常、メイン ウィンドウ、ダイアログ ボックス、またはメッセージ ボックスには、タイトル バーにウィンドウ名が表示されます (存在する場合)。 コントロールのクラスによっては、コントロールにウィンドウ名が表示される場合があります。 たとえば、ボタン、編集コントロール、静的コントロールは、コントロールによって占有される四角形内にウィンドウ名を表示します。 ただし、リスト ボックスやコンボ ボックスなどのコントロールには、ウィンドウ名は表示されません。
ウィンドウの作成後にウィンドウ名を変更するには、 SetWindowText 関数 を使用します。 この関数は 、GetWindowTextLength 関数と GetWindowText 関数を使用して、ウィンドウから現在のウィンドウ名文字列を取得します。
ウィンドウ スタイル
すべてのウィンドウには、1 つ以上のウィンドウ スタイルがあります。 ウィンドウ スタイルは、ウィンドウのクラスで指定されていないウィンドウの外観と動作の側面を定義する名前付き定数です。 アプリケーションは通常、ウィンドウの作成時にウィンドウ スタイルを設定します。 また、SetWindowLong 関数を使用して、ウィンドウの作成後にスタイルを設定することもできます。
システムと、ある程度クラスのウィンドウ プロシージャは、ウィンドウ スタイルを解釈します。
一部のウィンドウ スタイルはすべてのウィンドウに適用されますが、ほとんどの場合、特定のウィンドウ クラスのウィンドウに適用されます。 一般的なウィンドウ スタイルは、WS_ プレフィックスで始まる定数で表されます。これらは OR 演算子と組み合わせて、メインウィンドウ、ダイアログ ボックス、子ウィンドウなど、さまざまな種類のウィンドウを形成できます。 クラス固有のウィンドウ スタイルは、定義済みのコントロール クラスに属するウィンドウの外観と動作を定義します。 たとえば、 SCROLLBAR クラスはスクロール バー コントロールを指定しますが、 SBS_HORZ と SBS_VERT のスタイルによって、水平スクロール バー コントロールと垂直スクロール バー コントロールのどちらを作成するかが決まります。
ウィンドウで使用できるスタイルの一覧については、次のトピックを参照してください。
- ウィンドウ スタイル
- ボタンのスタイル
- コンボ ボックスのスタイル
- コントロール スタイルの編集
- リスト ボックスのスタイル
- リッチ エディット コントロール スタイル
- スクロール バー コントロールのスタイル
- 静的コントロールのスタイル
拡張ウィンドウ スタイル
必要に応じて、すべてのウィンドウに 1 つ以上の拡張ウィンドウ スタイルを設定できます。 拡張ウィンドウ スタイルは、ウィンドウ クラスまたはその他のウィンドウ スタイルで指定されていないウィンドウの外観と動作の側面を定義する名前付き定数です。 アプリケーションは通常、ウィンドウの作成時に拡張ウィンドウ スタイルを設定します。 また、SetWindowLong 関数を使用して、ウィンドウの作成後にスタイルを設定することもできます。
詳細については、「 CreateWindowEx」を参照してください。
位置
ウィンドウの位置は、左上隅の座標として定義されます。 これらの座標は、ウィンドウ座標と呼ばれることもありますが、常に画面の左上隅を基準とするか、子ウィンドウの場合は親ウィンドウのクライアント領域の左上隅を基準にしています。 たとえば、座標 (10,10) を持つ最上位ウィンドウは、画面の左上隅の右側に 10 ピクセル、そこから 10 ピクセル下に配置されます。 座標 (10,10) を持つ子ウィンドウは、親ウィンドウのクライアント領域の左上隅の右側に 10 ピクセル、そこから 10 ピクセル下に配置されます。
WindowFromPoint 関数は、画面上の特定のポイントを占めるウィンドウへのハンドルを取得します。 同様に、 ChildWindowFromPoint 関数と ChildWindowFromPointEx 関数は、親ウィンドウのクライアント領域の特定のポイントを占める子ウィンドウへのハンドルを取得します。 ChildWindowFromPointEx は非表示、無効、透明の子ウィンドウを無視できますが、ChildWindowFromPoint は無視できません。
サイズ
ウィンドウのサイズ (幅と高さ) はピクセル単位で指定されます。 ウィンドウの幅または高さは 0 にすることができます。 アプリケーションでウィンドウの幅と高さを 0 に設定すると、システムはサイズを既定の最小ウィンドウ サイズに設定します。 既定の最小ウィンドウ サイズを検出するために、アプリケーションは GetSystemMetrics 関数を使用し、 SM_CXMIN フラグと SM_CYMIN フラグを使用します。
アプリケーションでは、特定のサイズのクライアント領域を持つウィンドウを作成する必要がある場合があります。 AdjustWindowRect 関数と AdjustWindowRectEx 関数は、クライアント領域の目的のサイズに基づいて、ウィンドウの必要なサイズを計算します。 アプリケーションは、結果のサイズ値を CreateWindowEx 関数に渡すことができます。
アプリケーションは、ウィンドウのサイズを非常に大きくすることができます。ただし、画面よりも大きくなるようにウィンドウのサイズを変更しないでください。 ウィンドウのサイズを設定する前に、GetSystemMetrics と SM_CXSCREEN フラグとSM_CYSCREEN フラグを使用して、画面の幅と高さをチェックする必要があります。
親または所有者ウィンドウ ハンドル
ウィンドウには親ウィンドウを含めることができます。 親を持つウィンドウは、 子ウィンドウと呼ばれます。 親ウィンドウは、子ウィンドウの配置に使用される座標系を提供します。 親ウィンドウを持つことは、ウィンドウの外観の側面に影響します。たとえば、子ウィンドウがクリップされ、子ウィンドウの一部が親ウィンドウの境界線の外側に表示されなくなります。
親を持たないウィンドウ、または親がデスクトップ ウィンドウであるウィンドウは、 最上位ウィンドウと呼ばれます。 アプリケーションは EnumWindows 関数を使用して、画面上の各最上位ウィンドウへのハンドルを取得できます。 EnumWindows は 、各最上位ウィンドウにハンドルを渡し、アプリケーション定義のコールバック関数 EnumWindowsProc に渡します。
最上位のウィンドウは、別のウィンドウを所有することも、所有することもできます。 所有ウィンドウは常に所有者ウィンドウの前に表示され、所有者ウィンドウが最小化されると非表示になり、所有者ウィンドウが破棄されると破棄されます。 詳細については、「 所有 Windows」を参照してください。
メニュー ハンドルまたはChild-Window識別子
子ウィンドウには、 子ウィンドウ識別子、子ウィンドウ に関連付けられた一意のアプリケーション定義値を含めることができます。 子ウィンドウ識別子は、複数の子ウィンドウを作成するアプリケーションで特に便利です。 子ウィンドウを作成するときに、アプリケーションは子ウィンドウの識別子を指定します。 ウィンドウを作成した後、アプリケーションは SetWindowLong 関数を使用してウィンドウの識別子を変更することも、 GetWindowLong 関数を使用して識別子を取得することもできます。
子ウィンドウを除くすべてのウィンドウにメニューを設定できます。 アプリケーションは、ウィンドウのクラスを登録するとき、またはウィンドウを作成するときにメニュー ハンドルを提供することで、メニューを含めることができます。
アプリケーション インスタンス ハンドル
すべてのアプリケーションには、それに関連付けられたインスタンス ハンドルがあります。 システムは、アプリケーションの起動時にアプリケーションにインスタンス ハンドルを提供します。 同じアプリケーションの複数のコピーを実行できるため、システムはインスタンス ハンドルを内部的に使用して、アプリケーションの 1 つのインスタンスを別のインスタンスと区別します。 アプリケーションでは、ウィンドウを作成するものを含め、さまざまなウィンドウでインスタンス ハンドルを指定する必要があります。
作成データ
すべてのウィンドウには、アプリケーション定義の作成データを関連付けることができます。 ウィンドウが最初に作成されると、システムは上のデータへのポインターを、作成中のウィンドウのウィンドウ プロシージャに渡します。 ウィンドウ プロシージャでは、データを使用してアプリケーション定義変数を初期化します。
ウィンドウ ハンドル
ウィンドウを作成した後、作成関数はウィンドウを一意に識別する ウィンドウ ハンドル を返します。 ウィンドウ ハンドルには HWND データ型があります。アプリケーションでは、ウィンドウ ハンドルを保持する変数を宣言するときに、この型を使用する必要があります。 アプリケーションは、他の関数でこのハンドルを使用して、アクションをウィンドウに送信します。
アプリケーションは FindWindow 関数を使用して、指定したクラス名またはウィンドウ名を持つウィンドウがシステムに存在するかどうかを検出できます。 このようなウィンドウが存在する場合、 FindWindow はウィンドウにハンドルを返します。 特定のアプリケーションの子ウィンドウに検索を制限するには、 FindWindowEx 関数を使用します。
IsWindow 関数は、ウィンドウ ハンドルが有効な既存のウィンドウを識別するかどうかを決定します。 特定の関数のウィンドウ ハンドルを置き換えることができる特別な定数があります。 たとえば、アプリケーションは SendMessage 関数と SendMessageTimeout 関数でHWND_BROADCASTを使用したり、MapWindowPoints 関数でHWND_DESKTOPしたりできます。
ウィンドウの作成
アプリケーション ウィンドウを作成するには、 CreateWindow または CreateWindowEx 関数を 使用します。 ウィンドウ属性を定義するために必要な情報を指定する必要があります。 CreateWindowEx には、CreateWindow にはないパラメーター dwExStyle があります。それ以外の場合、関数は同じです。 実際、CreateWindow は、dwExStyle パラメーターを 0 に設定して CreateWindowEx を呼び出すだけです。 このため、この概要の残りの部分では CreateWindowEx のみを参照しています。
このセクションのトピックは次のとおりです。
Note
ダイアログ ボックスやメッセージ ボックスなど、特殊な用途のウィンドウを作成するための追加の機能があります。 詳細については、「 DialogBox」、「 CreateDialog」、「 MessageBox」を参照してください。
メイン ウィンドウの作成
すべての Windows ベースのアプリケーションには、エントリ ポイント関数として WinMain が必要です。 WinMain は、メイン ウィンドウのウィンドウ クラスの登録やメイン ウィンドウの作成など、さまざまなタスクを実行します。 WinMain は RegisterClass 関数を呼び出してメイン ウィンドウ クラスを登録し、CreateWindowEx 関数を呼び出してメイン ウィンドウを作成します。
WinMain 関数では、アプリケーションを 1 つのインスタンスに制限することもできます。 CreateMutex 関数を使用して名前付きミューテックスを作成します。 GetLastError がERROR_ALREADY_EXISTSを返す場合は、アプリケーションの別のインスタンスが存在し (ミューテックスを作成しました)、WinMain を終了する必要があります。
システムでは、作成後にメイン ウィンドウが自動的に表示されることはありません。代わりに、アプリケーションで ShowWindow 関数を使用してメイン ウィンドウを表示する必要があります。 メイン ウィンドウを作成した後、アプリケーションの WinMain 関数は ShowWindow を呼び出し、メイン ウィンドウへのハンドルと、メイン ウィンドウを最初に表示するときに最小化するか最大化するかを指定するフラグという 2 つのパラメーターを渡します。 通常、フラグは、SW_ プレフィックスで始まる任意の定数に設定できます。 ただし、ShowWindow を呼び出してアプリケーションのメイン ウィンドウを表示する場合は、フラグを SW_SHOWDEFAULT に設定する必要があります。 このフラグは、アプリケーションを開始したプログラムの指示にしたがってウィンドウを表示するようにシステムに指示します。
ウィンドウ クラスが Unicode バージョンの RegisterClass に登録されている場合、ウィンドウは Unicode メッセージのみを受信します。 ウィンドウで Unicode 文字セットを使用するかどうかを確認するには、 IsWindowUnicode を呼び出します。
メッセージのWindow-Creation
ウィンドウを作成すると、システムはウィンドウのウィンドウ プロシージャにメッセージを送信します。 システムは、ウィンドウの非クライアント領域を作成した後に WM_NCCREATE メッセージを送信し、クライアント領域を作成した後 にWM_CREATE メッセージを送信します。 ウィンドウ プロシージャは、システムがウィンドウを表示する前に両方のメッセージを受信します。 どちらのメッセージにも、CreateWindowEx 関数で指定されたすべての情報を含む CREATESTRUCT 構造体へのポインターが含まれています。 通常、ウィンドウ プロシージャは、これらのメッセージを受信すると初期化タスクを実行します。
子ウィンドウを作成すると、システムは 、WM_NCCREATEとWM_CREATE メッセージを送信した後、 WM_PARENTNOTIFY メッセージ を 親ウィンドウに送信します。 また、ウィンドウの作成時に他のメッセージも送信されます。 これらのメッセージの数と順序は、ウィンドウ クラスとスタイル、およびウィンドウの作成に使用される関数によって異なります。 これらのメッセージについては、このヘルプ ファイルの他のトピックで説明します。
マルチスレッド アプリケーション
Windows ベースのアプリケーションには複数の実行スレッドを含め、各スレッドでウィンドウを作成できます。 ウィンドウを作成するスレッドには、そのウィンドウ プロシージャのコードが含まれている必要があります。
アプリケーションは EnumThreadWindows 関数を使用して、特定のスレッドによって作成されたウィンドウを列挙できます。 この関数は、ハンドルを各スレッド ウィンドウに渡し、アプリケーション定義のコールバック関数 EnumThreadWndProc に渡します。
GetWindowThreadProcessId 関数は、特定のウィンドウを作成したスレッドの識別子を返します。
別のスレッドによって作成されたウィンドウの表示状態を設定するには、 ShowWindowAsync 関数を使用します。