レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API コントロールの概要

Microsoft(R) Windows(TM) では、 「コントロール」とは、 簡単な入出力 (I/O) 処理を実行するためにアプリケーションがほかのウィンドウとともに使用する子ウィンドウです。コントロールは主にダイアログ ボックス内で使われますが、 ダイアログ ボックス以外のウィンドウで使うこともできます。ダイアログ ボックスでは、 ユーザーはコントロールを使って、 テキストの入力、 オプションの選択、 処理の完了の指示などを行います。ダイアログ ボックス以外のウィンドウでは、 ユーザーはコントロールを使って、 コマンドの選択、 状態の表示、 テキストの表示と編集などを行います。

各コントロールは、 ほかのウィンドウと同様に、 定義済みまたはアプリケーション定義のウィンドウ クラスに属します。ウィンドウ クラスと対応するウィンドウ プロシージャによって、 コントロールのプロパティ、 外観、 動作、 目的が決まります。コントロールを個別に作成するには、 コントロールのウィンドウ クラス名を指定してCreateWindow関数またはCreateWindowEx関数を呼び出します。また、 ダイアログ ボックスのコントロールを作成するようにWindowsに指示するには、 ダイアログ ボックス テンプレートでコントロールを指定します。

コントロールは子ウィンドウです。Windowsがダイアログ ボックスのコントロールを作成すると、 各コントロールはそのダイアログ ボックスの子ウィンドウになります。アプリケーションがコントロールを作成すると、 そのコントロールは、 アプリケーションが指定したウィンドウの子ウィンドウになります。ユーザーからの入力などのイベントがコントロール内で発生したとき、 コントロールは親ウィンドウに「通知メッセージ」と呼ばれるメッセージを送るため、 この関係は重要です。アプリケーションは、 この通知メッセージを使って、 ユーザーがアプリケーションに指示している操作を判断できます。

コントロールはウィンドウであるため、 ShowWindow関数やEnableWindow関数などのウィンドウ管理関数で操作できます。コントロールのウィンドウ クラスが「コントロール メッセージ」をサポートしている場合は、 SendMessage関数を使ってコントロールにメッセージを送ることによってそのクラスのコントロールを操作できます。各コントロール メッセージの目的と機能はウィンドウ クラスによって異なり、 コントロールのウィンドウ プロシージャで定義されます。

次に示すトピックでは、 コントロールについて説明します。

定義済みコントロール

カスタム コントロール

定義済みコントロール

Windowsには、 コントロールの定義済みウィンドウ クラスがいくつか用意されています。定義済みウィンドウ クラスに属するコントロールは、 「定義済みコントロール」と呼ばれます。定義済みコントロールを作成するには、 適切なウィンドウ クラス名を指定してCreateWindow関数を呼び出すか、 ダイアログ ボックス テンプレートで適切なウィンドウ クラス名を指定します。定義済みウィンドウ クラスを次に示します。

名前 説明

BUTTON ボタン コントロールを作成します。通常、 このコントロールは、 ユーザーがコントロールを選択したときに親ウィンドウに通知します。

LISTBOX リスト ボックスを作成します。このコントロールは、 ユーザーが項目を1つ以上選択するためのリストを表示します。

EDIT エディット コントロールを作成します。ユーザーは、 このコントロールを使ってテキストを表示、 編集できます。

COMBOBOX コンボ ボックスを作成します。このコントロールは、 項目を選択、 編集するためのリスト ボックスとエディット コントロールの組み合わせです。

SCROLLBAR スクロール バー コントロールを作成します。ユーザーは、 このコントロールを使って、 対応するウィンドウ内の情報のスクロールの方向と距離を指示できます。

STATIC スタティック コントロールを作成します。このコントロールは、 ほかのコントロールのラベルとしてよく使われます。

 

各定義済みウィンドウ クラスには、 作成されるコントロールの外観と動作を変更するための「コントロール スタイル」のセットがあります。たとえば、 BUTTONクラスは、 プッシュ ボタン、 オプション ボタン、 チェック ボックス、 グループ ボックスを作成するスタイルをサポートしています。スタイルは、 コントロールを作成するときに指定します。

各定義済みウィンドウ クラスには、 対応する通知メッセージとコントロール メッセージのセットがあります。アプリケーションは、 通知メッセージを使って、 ユーザーがコントロールに入力を行ったことを知ることができます。たとえば、 プッシュ ボタンは、 ユーザーにクリックされると、 親ウィンドウにBN_CLICKEDメッセージを送ります。アプリケーションは、 コントロール メッセージを使って、 コントロールから情報を取得したり、 コントロールの外観や動作を操作できます。たとえば、 チェック ボックスにBM_GETCHECKメッセージを送ることによって、 チェック ボックスにチェック マークが付けられているかどうかを判断できます。

定義済みコントロールは、 ダイアログ ボックスなどのウィンドウで広範囲に使われます。定義済みコントロールには多くの機能があるため、 各機能の説明はこのトピックの範囲を超えます。

カスタム コントロール

定義済みコントロールがサポートしていない作業を実行するには、 カスタム コントロールを作成してください。Windowsでカスタム コントロールを作成するには、 次に示す方法があります。

・ オーナー描画のボタン、 リスト ボックス、 コンボ ボックスの使用

・ 既存のコントロール ウィンドウ クラスのサブクラス化

・ アプリケーション定義のウィンドウ クラスの作成と登録

ボタンやリスト ボックス、 コンボ ボックスには、 コントロールの描画が必要になるたびにコントロールが親ウィンドウにメッセージを送るようにするためのオーナー描画スタイルがあります。この機能によって、 コントロールの外観を変更できます。ボタンの場合、 オーナー描画スタイルは、 システムがコントロール全体を描画する方法に影響します。リスト ボックスやコンボ ボックスの場合、 コントロール内の項目は親ウィンドウが描画し、 コントロールの外枠はコントロール自体が描画します。たとえば、 リスト ボックスをカスタマイズすることによって、 リスト内の各項目の横に小さなビットマップを表示できます。

リスト ボックスやコンボ ボックス、 ボタンをオーナー描画コントロールにするには、 コントロールを作成するときに適切なスタイルを指定します。コントロールがオーナー描画スタイルを持っていれば、 Windowsはコントロールに対するユーザーの操作を通常通り処理し、 ユーザーがボタンを押したときの検出やボタンのオーナーに対するイベントの通知などを行います。しかし、 コントロールはオーナー描画であるため、 コントロールの外観は、 コントロールの親ウィンドウが決定します。

既存のコントロールをサブクラス化してカスタム コントロールを作成することもできます。サブクラス プロシージャは、 特定の動作に影響するメッセージを処理することによって、 コントロールの特定の動作を変更できます。関係のないメッセージは、 すべて、 コントロールの元のウィンドウ プロシージャに渡します。たとえば、 読み取り専用の単一行エディット コントロールのテキストの横に小さなビットマップを表示するには、 コントロールをサブクラス化して、 WM_PAINTメッセージを処理します。サブクラス化について、 詳しくはウィンドウ クラスの概要を参照してください。

定義済みコントロールをサブクラス化しても、 変更しない動作はすべてコントロールのウィンドウ プロシージャに実行させることができます。

カスタム コントロールを作成するには、 アプリケーション定義のウィンドウ クラスを登録し、 そのウィンドウ クラスの名前を指定してCreateWindow関数かCreateWindowEx関数を呼び出すか、 ウィンドウ クラス名をダイアログ ボックス テンプレートに指定します。カスタム コントロールのアプリケーション定義ウィンドウ クラスを登録するための処理は、 通常のウィンドウのクラスの登録と同じです。各クラスには、 一意な名前や対応するウィンドウ プロシージャなどの情報があります。

ウィンドウ プロシージャは、 少なくとも、 コントロールを描画します。また、 コントロールを使ってユーザーに情報を入力させる場合は、 ウィンドウ プロシージャは、 キーボードやマウスからの入力メッセージを処理し、 親ウィンドウに通知メッセージを送ります。さらに、 コントロールがコントロール メッセージをサポートしている場合、 ウィンドウ プロシージャは、 親ウィンドウなどのウィンドウから送られたメッセージを処理します。たとえば、 コントロールは、 ダイアログ ボックスから送られたWM_GETDLGCODEメッセージを処理して、 指定した方法でキーボード入力を処理するようにダイアログ ボックスに指示できます。

通知メッセージ

コントロールは、 親ウィンドウに通知メッセージを送って、 ユーザー入力やコントロールの変更を親ウィンドウに通知します。通知メッセージとは、 コントロール識別子とイベントの種類を示す通知コードを含むWM_COMMANDメッセージです。「コントロール識別子」とは、 メッセージを送ったコントロールをアプリケーションが識別するために使われる一意な値です。コントロールの識別子は、 コントロールを作成するときに設定します。識別子は、 CreateWindow関数やCreateWindowEx関数のhMenuパラメータに指定するか、 ダイアログ ボックス テンプレート (DLGITEMTEMPLATE構造体) のidメンバに指定します。

コントロール自体はコントロール識別子を設定しないため、 コントロールは、 通知メッセージを送る前に識別子を取得しなければなりません。自分自身のコントロール識別子を取得するには、 GetDlgCtrlID関数を使います。コントロール識別子はコントロールを作成するときにメニュー ハンドルとして指定しますが、 GetMenu関数を使って識別子を取得することはできません。しかし、 WM_CREATEメッセージを処理するときに、 CREATESTRUCT構造体のhMenuメンバから識別子を取得することはできます。

コントロール メッセージ

親ウィンドウなどのウィンドウは、 コントロール メッセージを送って、 特定の作業を実行するようにコントロールに指示します。コントロールのウィンドウ プロシージャは、 コントロール メッセージを処理して、 要求された動作を実行します。

コントロール メッセージには、 定義済みのものとアプリケーション定義のものがあります。Windowsがコントロールに送る定義済みメッセージには、 WM_GETTEXTWM_GETDLGCODEがあります。通常、 これらのメッセージは、 ウィンドウに対する動作を実行するウィンドウ管理関数に対応しています。一般に、 アプリケーション定義コントロールのウィンドウ プロシージャは、 次の表に示す定義済みコントロール メッセージのうち、 コントロールの動作に影響するものを処理しなければなりません。

メッセージ 推奨動作

WM_GETDLGCODE コントロールがEnterEscTab、 方向キーなどを使用する場合は処理してください。IsDialogMessage関数は、 ダイアログ ボックス内のコントロールにこのメッセージを送って、 キーを処理するかコントロールに渡すかを判断します。

WM_GETFONT WM_SETFONTメッセージも処理するときはこのメッセージも処理してください。

WM_GETTEXT コントロールのテキストがCreateWindow関数やCreateWindowEx関数で指定したタイトルと異なる場合は処理してください。

WM_GETTEXTLENGTH コントロールのテキストがCreateWindow関数やCreateWindowEx関数で指定したタイトルと異なる場合は処理してください。

WM_KILLFOCUS キャレットやフォーカス長方形などの入力フォーカスを持つことを示すものをコントロールに表示するときは処理してください。

WM_SETFOCUS キャレットやフォーカス長方形などの入力フォーカスを持つことを示すものをコントロールに表示するときは処理してください。

WM_SETTEXT コントロールのテキストがCreateWindow関数やCreateWindowEx関数で指定したタイトルと異なる場合は処理してください。

WM_SETFONT コントロールにテキストを表示するときは処理してください。Windowsは、 DS_SETFONTスタイルのダイアログ ボックスを作成するときにこのメッセージを送ります。

アプリケーション定義のコントロール メッセージは特定のコントロールに固有であり、 SendMessageSendDlgItemMessage関数を使って明示的にコントロールに送らなければなりません。各メッセージの値は一意でなければならず、 ほかのウィンドウ メッセージの値と重複しないようにしなければなりません。アプリケーション定義のメッセージ値が重複しないようにするには、 WM_USER値に一意な値を加算して各メッセージ値を作成してください。

メッセージ

コントロールに関するメッセージを次に示します。

WM_GETFONT

WM_SETFONT

WM_SETTEXT

 

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします