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

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

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

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

Windows API ボタンの概要

Microsoft(R) Windows(TM) では、 アプリケーションとユーザーの対話をサポートするためのダイアログ ボックスとコントロールを用意しています。「ボタン」とは、 ユーザーがオンまたはオフしてアプリケーションに入力を伝えるためのコントロールです。ボタンにはいくつかの種類があります。また、 各種類には1つ以上のスタイルがあり、 同じ種類のボタンでも互いに区別できます。ユーザーは、 マウスやキーボードでボタンを選択することによってボタンをオンまたはオフにできます。通常、 ボタンを選択すると、 ボタンの表示と状態が変化します (たとえば、 チェック状態からチェック解除状態になります)。ボタンの表示と状態の変化には、 Windows、 ボタン、 アプリケーションがかかわっています。ボタンは自分の親ウィンドウにメッセージを送ることができ、 親ウィンドウはボタンにメッセージを送ることができます。ボタンには、 Windowsが描画するものとアプリケーションが描画するものがあります。ボタンは単独またはグループで使うことができ、 アプリケーション定義のテキスト (ラベル) を付けることもできます。ボタンは、 BUTTONウィンドウ クラスに属します。

ボタンはオーバーラップ ウィンドウやポップアップ ウィンドウ、 子ウィンドウなどでも使えますが、 ダイアログ ボックスで使うように設計されており、 Windowsではダイアログ ボックス内でのボタンの動作を標準化しています。アプリケーションがダイアログ ボックス以外でボタンを使うときは、 標準でない動作が発生する可能性があります。通常は、 ボタンをダイアログ ボックスで使うか、 ウィンドウをサブクラス化してカスタム ボタンを作成します。

コントロールの一般的な説明は、 コントロールの概要を参照してください。ダイアログ ボックスについて詳しくは、 ダイアログ ボックスの概要を参照してください。ウィンドウのサブクラスについては、 ウィンドウ プロシージャの概要を参照してください。

次に示すトピックでは、 ボタンについて説明しています。

ボタンの種類とスタイル

ボタンの状態

ボタンからの通知メッセージ

ボタンへのメッセージ

ボタンのカラー メッセージ

デフォルトのメッセージ処理

ダイアログ ボックス以外でのボタンの作成

オーナー描画でないボタンの使用

オーナー描画ボタンの使用

ボタン関数とメッセージ

ボタンの種類とスタイル

Windowsでは、 プッシュ ボタン、 チェック ボックス、 オプション ボタン (ラジオ ボタンともいう)、 グループ ボックス、 オーナー描画ボタンの5種類のボタンを用意しています。各種類には、 1つ以上のスタイルがあります。

 

プッシュ ボタン

「プッシュ ボタン」とは、 ユーザーがボタンを選択したときの動作を示すアプリケーション定義のテキスト (ラベル) またはビットマップを持つ角の丸い長方形です。プッシュ ボタンには、 プッシュ ボタンとデフォルト プッシュ ボタンの2つのスタイルがあり、 それぞれ、 BS_PUSHBUTTON定数とBS_DEFPUSHBUTTON定数で定義されています。標準のプッシュ ボタンは、 通常操作を開始するために使われます。プッシュ ボタンは、 ユーザーが選択するとキーボード フォーカスを受け取ります。しかし、 デフォルト プッシュ ボタンは、 通常は操作の取り消しに使われます。デフォルト プッシュ ボタンは、 作成されたとき (デフォルトになるとき) にキーボード フォーカスを受け取ります。

ユーザが (いずれかのスタイルの) プッシュ ボタンを選択すると、 プッシュ ボタンは、 Windowsからキーボード フォーカスを受け取って、 BN_CLICKED通知コードを持つWM_COMMANDメッセージを親ウィンドウに送ります。通常、 親ウィンドウは、 メッセージを受け取ると、 ボタンを強調表示状態に設定して、 ダイアログ ボックスをクローズし、 操作を開始 (または取り消し) します。

 

チェック ボックス

「チェック ボックス」は、 四角形と、 ユーザーがボタンを選択する際に参照するアプリケーション定義のテキスト (ラベル) またはビットマップからなります。通常、 チェック ボックスはグループ ボックスに表示して、 関連する個々のオプションからユーザーが選択できるようにします。たとえば、 どのようなエラー状況の場合に警告音を発生させるかをユーザーが選択できるチェック ボックスのグループを表示できます。

チェック ボックスには、 チェック ボックス、 自動チェック ボックス、 3ステート チェック ボックス、 自動3ステート チェック ボックスの4スタイルがあります。これらのスタイルは、 それぞれ、 BS_CHECKBOXBS_AUTOCHECKBOXBS_3STATEBS_AUTO3STATEの確定数で定義されています。すべてのスタイルに、 チェック状態 (ボックスの中に“X”がある状態) とチェック解除状態 (“X”がない状態)の2つの状態があります。さらに、 3ステート チェック ボックスには、 使用不能状態 (ボックスが灰色表示されている状態) があります。標準チェック ボックスや自動チェック ボックスを繰り返し選択すると、 チェック状態とチェック解除状態が切り換わります。また、 3ステート チェック ボックスを繰り返し選択すると、 チェック状態、 チェック解除状態、 灰色表示状態の間で切り換わります。

 

3ステート チェック ボックスの3つの状態すべてを次の図に示します。

ユーザーがチェック ボックスを選択すると、 チェック ボックスは、 Windowsからキーボード フォーカスを受け取り、 BN_CLICKED通知コードを持つWM_COMMANDメッセージを親ウィンドウに送ります。このメッセージが自動チェック ボックスまたは自動3ステート チェック ボックスからのものならば、 Windowsがチェック状態や強調表示状態を自動的に設定するため、 親ウィンドウはメッセージを処理しません。しかし、 メッセージがチェックボックスまたは3ステート チェック ボックスからのものならば、 Windowsではなく親ウィンドウがチェック状態と強調表示状態を設定しなければならないため、 親ウィンドウがメッセージを処理しなければなりません。チェック ボックスのスタイルにかかわらず、 Windowsは、 状態が変更されたチェック ボックスを自動的に再描画します。

デフォルトでは、 ラベルはチェック ボックスの右側に表示されます。左側テキスト スタイル (BS_LEFTTEXT) を使うことによって、 ラベルを左側に置くことができます。左側テキスト スタイルは単なるスタイルであり、 独立したボタンの種類ではありません。

 

オプション ボタン (またはラジオ ボタン)

「オプション ボタン」は、 丸いボタンと、 ユーザーがボタンを選択する際に参照するアプリケーション定義のテキスト (ラベル) またはビットマップからなります。通常、 オプション ボタンは、 関連しているけれども互いに排他的なオプションをユーザーが選択できるようにするために使われます。たとえば、 クライアント領域で選択されているテキストの書式をユーザーが選択するためのオプション ボタンのグループを表示できます。この場合、 ユーザーは、 左寄せ、 右寄せ、 中央揃えのなかから、 対応するオプション ボタンを選択することによって書式を選択できます。通常、 1つのオプション ボタンのセットから一度に選択できるボタンは1つだけです。

オプション ボタンには、 オプション ボタンと自動オプション ボタンの2つのスタイルがあります。これらのスタイルは、 それぞれ、 BS_RADIOBUTTON定数とBS_AUTORADIOBUTTON定数で定義されています。どちらのスタイルにも、 チェック状態 (ボタンの中に黒い丸がある状態) とチェック解除状態 (丸がない状態) の2つのチェック状態があります。(標準または自動の) チェック ボックスを繰り返し選択すると、 チェック状態とチェック解除状態が切り換わります。3ステート チェック ボックスを繰り返し選択すると、 チェック状態、 チェック解除状態、 灰色と順番に切り換わります。ラジオ ボタンの図は、 「グループ ボックス」を参照してください。

ユーザーがどちらかの状態を選択すると、 オプション ボタンは、 Windowsからキーボード フォーカスを受け取り、 BN_CLICKED通知コードを持つWM_COMMANDメッセージを親ウィンドウに送ります。このメッセージが自動オプション ボタンからのものならば、 Windowsがチェック状態や強調表示状態を自動的に設定するため、 親ウィンドウはメッセージを処理しません。しかし、 メッセージがオプション ボタンからのものならば、 Windowsではなく親ウィンドウがチェック状態と強調表示状態を設定しなければならないため、 親ウィンドウがメッセージを処理しなければなりません。オプション ボタンのスタイルにかかわらず、 Windowsは、 状態が変更されたオプション ボタンを自動的に再描画します。

ユーザーが自動オプション ボタンを選択すると、 Windowsは、 同じグループで以前に選択されていた自動オプション ボタンの選択を自動的に解除します。ダイアログ ボックスの概要で説明されているように、 標準オプション ボタンでも、 WS_GROUPスタイルを使うことによって、 同じ動作が得られます。

デフォルトでは、 ラベルはオプション ボタンの右側に表示されます。左側テキスト スタイル (BS_LEFTTEXT) を使うことによって、 ラベルを左側に置くことができます。左側テキスト スタイルは単なるスタイルであり、 独立したボタンの種類ではありません。

 

オーナー描画ボタン

「オーナー描画ボタン」は、 オプション ボタンとは異なり、 Windowsではなくアプリケーションが描画し、 表示や使用方法は定義されていません。このボタンの目的は、 アプリケーションが独自に定義した表示と動作を持つボタンを提供することです。オーナー描画ボタンのスタイルは、 BS_OWNERDRAWだけです。

ユーザーがオーナー描画ボタンを選択すると、 Windowsは、 BN_CLICKED通知コードを持つWM_COMMANDメッセージをボタンの親ウィンドウに送ります。これは、 オーナー描画でないボタンと同じです。アプリケーションは、 このメッセージに対して適切に応答しなければなりません。

 

グループ ボックス

「グループ ボックス」とは、 チェック ボックスやオプション ボタンなどのコントロールのセットの周りを囲み、 左上隅にアプリケーション定義のテキスト (ラベル) がある長方形です。グループ ボックスの唯一の目的は、 ある共通の目的 (通常はラベルで示されます) を持つ関連したコントロールを組織化することです。グループ ボックスのスタイルは、 BS_GROUPBOXだけです。

2つのオプション ボタンを含むグループ ボックスを次の図に示します。

グループ ボックスは選択できないため、 チェック状態やフォーカス状態、 強調表示状態、 使用可能状態などはありません。また、 グループ ボックスにメッセージを送ることはできません。

 

ボタンのスタイル

ほとんどの場合は、 スタンド アローンのツールを使ってダイアログ ボックスを作成するため、 ボタン スタイルを指定する必要はありません。しかし、 CreateWindow関数やCreateWindowEx関数を使ってボタンを作成するときは、 次の表の定数を使ってボタン スタイルを定義してください。

 

スタイル 意味

BS_3STATE チェック ボックスと同じボタンを作成しますが、 ボタンは灰色表示にすることもできます。チェック ボックスの状態が不定であることを示すには、 灰色状態を使ってください。

BS_AUTO3STATE 3ステート チェック ボックスと同じボタンを作成しますが、 このボタンをユーザーが選択すると自動的に状態が変わります。状態は、 チェック、 灰色、 通常の間で切り換わります。

BS_AUTOCHECKBOX チェック ボックスと同じボタンを作成しますが、 ユーザーがボタンを選択すると自動的に“X”がチェック ボックス内に表示されます。ユーザーがチェック ボックスをもう一度選択すると、 “X”は消去されます。

BS_AUTORADIOBUTTON オプション ボタンと同じボタンを作成しますが、 このボタンをユーザーが選択すると自動的に強調表示され、 同じグループのほかのボタンの選択が解除されます。

BS_BITMAP ボタンがビットマップを表示することを指定します。

BS_CHECKBOX テキストが右側に表示された小さな空の正方形を作成します。BS_LEFTTEXTスタイルが組み合わされているときは、 テキストは左側に表示されます。

BS_DEFPUSHBUTTON 太い境界線を持つボタンを作成します。このボタンは、 Enterキーを押すことによって選択されます。このスタイルは、 最も適切な (デフォルトの) オプションをユーザーが簡単に選択できるようにするのに役立ちます。

BS_GROUPBOX ほかのコントロールをグループ化するための長方形を作成します。このスタイルに関連付けられているテキストは、 長方形の左上隅に表示されます。

BS_ICON ボタンがアイコンを表示することを指定します。

BS_LEFTTEXT ボタンの長方形の中に左ぞろえでテキストを配置します。しかし、 ボタンがBS_RIGHTBUTTONスタイルを持たないチェック ボックスやラジオ ボタンの場合は、 テキストはチェック ボックスやラジオ ボタンの右側に左ぞろえで配置されます。

BS_MONO ボタンにはテキストが1行しかないことを指定します。

BS_OWNERDRAW オーナー描画ボタンを作成します。オーナー ウィンドウは、 ボタンが作成されるときにWM_MEASUREITEMメッセージを受け取り、 ボタンの表示が変更されるときにWM_DRAWITEMメッセージを受け取ります。BS_OWNERDRAWスタイルはほかのボタン スタイルと組み合わせないでください。

BS_PUSHBUTTON ユーザーがボタンを選択したときにWM_COMMANDメッセージをオーナー ウィンドウにポストするプッシュ ボタンを作成します。

BS_RADIOBUTTON テキストが右側に表示されている小さな丸を作成します。BS_LEFTTEXTスタイルが組み合わされているときは、 テキストは左側に表示されます。関連しているけれども互いに排他的な選択には、 オプション ボタンのグループを使ってください。

BS_TEXT ボタンがテキストを表示することを指定します。

BS_USERBUTTON 使われなくなりました。16ビット版のWindowsとの互換性を保つために提供されています。Win32ベースのアプリケーションでは、 代わりにBS_OWNERDRAWを使ってください。

 

ボタンの状態

このトピックでは、 ボタンの選択による状態の変化と、 それに対するアプリケーションの応答について説明します。

 

ボタンの選択

ユーザーは、 マウスによるクリック、 Tabキーによる移動とEnterによる選択、 (ボタンがWS_GROUPスタイルで定義されたグループの一部であるときは) Tabキーによるグループへの移動と方向キーによるグループ内での移動の3つの方法でボタンを選択できます。これらのTabキーによる移動は、 Windowsが用意している定義済みキーボード インターフェイスの一部です。このインターフェイスについて詳しくは、 ダイアログ ボックスの概要を参照してください。

通常、 ボタンを選択すると、 次に示すイベントが発生します。

・ Windowsがボタンにキーボード フォーカスを設定します。

・ ボタンが親ウィンドウに選択を示すメッセージを送ります。

・ 親ウィンドウ (またはWindows) が状態変更メッセージをボタンに送ります。

・ 親ウィンドウ (またはWindows) がボタンを再描画して新しい状態を反映します。

「ボタン状態の種類」では、 上記のイベントとボタンの状態についてさらに詳しく説明します。

 

ボタン状態の種類

ボタンの状態には、 フォーカス状態、 強調表示状態、 チェック状態、 使用可能状態があります。フォーカス状態は、 チェック ボックス、 オプション ボタン、 プッシュ ボタン、 オーナー描画ボタンに適用されます。ユーザーがボタンを選択するとそのボタンはフォーカスを受け取り、 ユーザーがほかのボタンを選択するとフォーカスを失います。同時に複数のボタンにキーボード フォーカスを与えることはできません。たとえば、 グループ内のあるボタンがフォーカスを受け取ると、 オプション ボタンの相互排他性を守るため、 グループで以前に選択されていたボタンはフォーカスを失います。

強調表示状態は、 チェック ボックス、 オプション ボタン、 プッシュ ボタン、 オーナー描画ボタンに適用されます。ボタンは、 キーボード フォーカスを受け取ると強調表示され、 フォーカスを失うと強調表示が解除されます。通常、 強調表示されているボタンのテキストまたはビットマップの周りには点線が描画され、 ボタンの周りには黒い太線が描画されます。Windowsは自動ボタンの強調表示状態を自動的に変更しますが、 自動でないボタンの強調表示状態はアプリケーションが変更しなければなりません。

チェック状態は、 チェック ボックス、 オプション ボタン、 3ステート チェック ボックスに適用されますが、 それ以外のボタンには適用されません。状態には、 チェック状態とチェック解除状態があり、 3ステート チェック ボックスの場合は、 さらに使用不能状態があります。チェック ボックスが選択されると“X”が表示され、 チェック解除されると“X”が消去されます。オプション ボタンがチェックされると黒い丸が表示され、 チェック解除されると黒い丸が消去されます。3ステート チェック ボックスは、 チェックされると“X”が表示され、 チェック解除されると“X”が消去され、 使用不能になると灰色表示になります。Windowsは自動ボタンのチェック状態を自動的に変更しますが、 自動でないボタンのチェック状態はアプリケーションが変更しなければなりません。

使用可能状態は、 標準または自動の3ステート チェック ボックスに適用されますが、 それ以外のボタンには適用されません。状態には、 使用可能と使用不能があります。

 

ボタン状態の変更

通常、 ユーザーがボタンを選択すると、 ボタンをいずれかの状態に変更しなければなりません。Windowsは、 すべてのボタンの種類に対してフォーカス状態を自動的に変更し、 自動ボタンの場合は強調表示、 チェック、 使用可能の各状態も自動的に変更します。しかし、 それ以外の状態は、 ボタンの種類、 スタイル、 現在の状態を考慮して、 アプリケーションが変更しなければなりません。各ボタンの種類で変更しなければならない状態要素を次のリストに示します。

・ プッシュ ボタンの場合、 チェックしたり使用不能にすることはできないため、 強調表示状態は変更しなければなりませんが、 チェック状態や使用可能状態は変更してはいけません。

・ チェック ボックスの場合、 チェック状態と強調表示状態を変更しなければなりません。また、 3ステート チェック ボックスの場合は、 使用可能状態も変更しなければなりません。

・ オプション ボタンの場合、 チェック状態と強調表示状態を変更しなければなりませんが、 オプション ボタンは使用不能にはできないため、 使用可能状態は変更してはいけません。また、 オプション ボタンの相互排他性を守るため、 同じグループのほかのオプション ボタンを変更しなければならない場合もあります。

・ オーナー描画ボタンの状態はアプリケーションによって異なるため、 ボタン状態の変更方法はさまざまです。

・ ユーザーはグループ ボックスを選択できないため、 グループ ボックスの要素は変更してはいけません。

ボタンの状態を判断するには、 BM_GETCHECKメッセージまたはBM_GETSTATEメッセージをボタンに送ってください。ボタンの状態を設定するには、 BM_SETCHECKメッセージまたはBM_SETSTATEメッセージをボタンに送ってください。

 

ボタンからの通知メッセージ

ユーザーがボタンを選択すると、 ボタンの状態が変化し、 ボタンは親ウィンドウに通知メッセージを送ります。たとえば、 プッシュ ボタン コントロールは、 ユーザーがボタンを選択するたびに、 BN_CLICKED通知メッセージを送ります。どの場合も、 wParamパラメータの下位ワードはコントロール識別子を示しており、 wParamパラメータの上位ワードは通知コードを示しています。また、 lParamパラメータのはコントロール ウィンドウのハンドルを示しています。

移植上の問題: Microsoft(R) Windows NT(TM) では、 通知メッセージの通知コードは、 lParamパラメータではなくwParamパラメータに設定されるようになりました。この変更に従うため、 Windows 3.xベースのアプリケーションをWindows NTに移植するときは、 通知メッセージを処理するコードを修正しなければなりません。

メッセージとそれに対する親ウィンドウの応答は、 ボタンの種類、 スタイル、 現在の状態によって異なります。アプリケーションが監視して処理しなければならないボタン通知メッセージを次に示します。

 

メッセージ 説明

BN_CLICKED ユーザーがボタンをクリックしました。

BN_DISABLE ボタンが使用不能になりました。

BN_HILITE ユーザーがボタンを強調表示しました。

BN_PAINT ボタンを描画しなければなりません。

BN_UNHILITE 強調表示を解除しなければなりません。

自動ボタンの場合、 使用不能、 強調表示とその解除、 描画はオペレーティング システムが行います。ボタンへのメッセージの送信について詳しくは、 ボタンへのメッセージを参照してください。

ユーザーがオーナー描画ボタンを選択すると、 そのボタンは、 描画すべきコントロールの識別子と寸法や状態に関する情報を含むWM_DRAWITEMメッセージを親ウィンドウに送ります。このメッセージについて詳しくは、 オーナー描画ボタンの使用を参照してください。

 

ボタンへのメッセージ

親ウィンドウは、 オーバーラップ ウィンドウや子ウィンドウ内のボタンに対して、 SendMessage関数を使ってメッセージを送ることができます。また、 ダイアログ ボックス内のボタンに対しては、 SendDlgItemMessage CheckDlgButtonCheckRadioButton, and IsDlgButtonCheckedの各関数を使ってメッセージを送ることができます。

2ステート ボタン (チェック ボックス、 自動チェック ボックス、 オプション ボタン、 自動オプション ボタン) のチェック状態を取得するには、 BM_GETCHECKメッセージを使ってください。また、 ボタンの現在の状態 (チェック状態、 強調表示状態、 フォーカス状態) を取得するには、 BM_GETSTATEメッセージを使ってください。このメッセージはボタンのフォーカス状態または強調表示状態を取得し、 3ステート チェック ボックスの場合はチェック状態を取得します。特定の状態に関する情報を取得するには、 返された状態値にビットマスクをかけて調べてください。

BM_SETCHECKメッセージは、 チェック ボックスやオプション ボタンのチェック状態を設定します。このメッセージは0を返します。BM_SETSTATEメッセージは、 ボタンの強調表示状態を設定します。このメッセージも0を返します。BM_SETSTYLEメッセージは、 ボタンのスタイルを変更します。このメッセージは、 特定の種類のボタンのスタイルを変更する (たとえば、 チェック ボックスを自動チェック ボックスに変更する) ためのものであり、 種類を変更する (たとえば、 チェック ボックスをプッシュ ボタンに変更する) ためのものではありません。ボタンの種類は変更しないでください。

また、 デフォルト プッシュ ボタン コントロールの識別子を取得するには、 DM_GETDEFIDメッセージを使ってください。ダイアログ ボックスのデフォルト プッシュ ボタンを設定するには、 DM_SETDEFIDメッセージを使ってください。

CheckDlgButton関数やCheckRadioButton関数を呼び出すのとBM_SETCHECKメッセージを送るのは同じ効果があります。IsDlgButtonChecked関数を呼び出すのとBM_GETCHECKメッセージを送るのは同じ効果があります。

 

ボタンのカラー メッセージ

Windowsでは、 ボタンのデフォルトのカラー値を用意しています。システムは、 ボタンが描画される前に、 ボタンの親ウィンドウにWM_CTLCOLORBTNメッセージを送ります。このメッセージには、 ボタンのデバイス コンテキストのハンドルと、 子ウィンドウのハンドルが含まれています。親ウィンドウは、 このハンドルを使って、 ボタンのテキストや背景の色を変更できます。デフォルトのボタンのカラー値を次の表に示します。

色の設定対象

COLOR_BTNFACE ボタンの表面

COLOR_BTNHIGHLIGHT ボタンの強調表示領域 (上端と左端)

COLOR_BTNSHADOW ボタンの影領域 (下端と右端)

COLOR_BTNTEXT ボタンの通常 (灰色でない) テキスト

COLOR_GRAYTEXT ボタンの使用不能 (灰色) テキスト。現在のディスプレイ ドライバがソリッドの灰色をサポートしていないときは、 この色は0に設定されます。

COLOR_WINDOW ウィンドウの背景

COLOR_WINDOWFRAME ウィンドウの枠

COLOR_WINDOWTEXT ウィンドウのテキスト

上記の色のデフォルト値を取得するには、 GetSysColor関数を呼び出してください。また、 値を設定するには、 SetSysColors関数を呼び出してください。システム カラーについて詳しくは、 システム情報の概要を参照してください。コントロールでカラーを使う方法について詳しくは、 コントロールの概要を参照してください。

移植上の問題: Windows NTでは、 WM_CTLCOLORメッセージはコントロールのカラー メッセージで置き換えられています。Windows 3.xベースのアプリケーションをWindows NTに移植するときは、 WM_CTLCOLORメッセージを処理するコードを修正してください。

 

デフォルトのメッセージ処理

定義済みボタン コントロール ウィンドウ クラスのウィンドウ プロシージャは、 ボタン コントロール プロシージャが処理しないメッセージのデフォルト処理をすべて行います。ボタン コントロール プロシージャがメッセージに対してFALSEを返すと、 定義済みウィンドウ プロシージャはそのメッセージをチェックし、 次の表に示すデフォルト処理を行います。

 

メッセージ デフォルト処理

BM_CLICK WM_LBUTTONDOWNおよびWM_LBUTTONUPメッセージをボタンに送り、 BN_CLICKEDメッセージを親ウィンドウに送ります。

BM_GETCHECK ボタンのチェック状態を返します。

BM_GETSTATE ボタンの現在の状態を返します。

BM_SETCHECK オプション ボタンやチェック ボックスのどのスタイルの場合でも、 チェック マークを設定します。オプション ボタンの場合、 wParamパラメータが0より大きいときは、 ボタンにはWS_TABSTOPスタイルが設定されます。

BM_SETSTATE ボタンの強調表示を設定または解除します。オーナー描画ボタンの場合、 ボタンの状態が変更されたときは、 WM_DRAWITEMメッセージが親ウィンドウに送られます。

BM_SETSTYLE ボタンのスタイルを設定します。lParamパラメータの下位ワードがTRUEならば、 ボタンは再描画されます。

WM_CHAR ユーザーが+キーまたは=キーを押したときに、 チェック ボックスまたは自動チェック ボックスをチェックします。ユーザーが-キーを押したときは、 チェック ボックスまたは自動チェック ボックスのチェックを解除します。

WM_ENABLE ボタンを描画します。

WM_ERASEBKGND オーナー描画ボタンの背景を消去します。それ以外のボタンの背景は、 WM_PAINTメッセージやWM_ENABLEメッセージの処理中に消去されます。

WM_GETDLGCODE デフォルト ボタン プロシージャが処理する入力の種類を示す値を返します。返される値を次に示します。

 

ボタンのスタイル 戻り値

BS_AUTOCHECKBOX DLGC_WANTCHARS | DLGC_BUTTON

BS_AUTORADIOBUTTON DLGC_RADIOBUTTON

BS_CHECKBOX DLGC_WANTCHARS | DLGC_BUTTON

BS_DEFPUSHBUTTON DLGC_DEFPUSHBUTTON

BS_GROUPBOX DLGC_STATIC

BS_PUSHBUTTON DLGC_UNDEFPUSHBUTTON

BS_RADIOBUTTON DLGC_RADIOBUTTON 

WM_GETFONT 現在のフォントのハンドルを返します。

WM_KEYDOWN ユーザーがSpaceキーを押したときは、 ボタンを強調表示します。

WM_KEYUP Tabキーが押されていたとき以外は、 マウスのキャプチャを解放します。

WM_KILLFOCUS ボタンのフォーカス長方形を解除します。プッシュ ボタンやデフォルト プッシュ ボタンの場合は、 フォーカス長方形が無効化されます。ボタンがマウス キャプチャを持っていれば、 キャプチャは解放されてボタンはクリックされていない状態になり、 強調表示は解除されます。

WM_LBUTTONDBLCLK ダブルクリックはWM_LBUTTONDOWNメッセージとして処理されます。

WM_LBUTTONDOWN マウス カーソルがボタンのクライアント長方形内にあれば、 ボタンを強調表示します。

WM_LBUTTONUP ボタンがマウス キャプチャを持っていれば、 マウス キャプチャを解放します。

WM_MOUSEMOVE ボタンがキャプチャを持っていれば、 WM_LBUTTONDOWNと同じ処理を行います。そうでないときは、 何もしません。

WM_NCCREATE BS_USERBUTTONボタンをBS_PUSHBUTTONに変更します。

WM_NCHITTEST ボタン コントロールがグループ ボックスならば、 HTTRANSPARENTを返します。

WM_PAINT ボタンのスタイルと現在の状態に応じて、 ボタンを描画します。

WM_SETFOCUS フォーカスを取得しようとしているボタンのフォーカス長方形を描画します。オプション ボタンや自動オプション ボタンの場合は、 BN_CLICKEDメッセージが親ウィンドウに送られます。

WM_SETFONT 新しいフォントを設定し、 必要ならばウィンドウを更新します。

WM_SETTEXT ボタンのテキストを設定します。グループ ボックスの場合は、 既存のテキストを描画してから、 新しいテキストを持つグループ ボックスを再描画します。

WM_SYSKEYUP Tabキーでなければ、 マウス キャプチャを解放します。

定義済みウィンドウ プロシージャは、 上記以外のメッセージはすべてDefWindowProc関数に渡してデフォルトの処理を実行させます。

 

ボタンの使用

次に示すタスクをクリックすると、 そのタスクの実行方法が表示されます。

ダイアログ ボックス以外でのボタンの作成

オーナー描画でないボタンの使用

オーナー描画ボタンの使用

ダイアログ ボックス以外でのボタンの作成

次に示すコード例は、 CreateWindow関数を使ってデフォルト プッシュ ボタンを作成する方法を示しています。

hwndButton = CreateWindow(
"BUTTON", /* predefined class */
"OK", /* button text */
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, /* styles */
/*
* Size and position values are given explicitly, because
* the CW_USEDEFAULT constant gives zero values for buttons.
*/

10, /* starting x position */
10, /* starting y position */
100, /* button width */
100, /* button height */
hwnd, /* parent window */
NULL, /* No menu */
(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); /* pointer not needed */

オーナー描画でないボタンの使用

この項のコード例は、 次の図に示したダイアログ ボックスのウィンドウ プロシージャを示しています。

[Buttons]ダイアログ ボックスのチェック ボックスとオプション ボタンは自動です。チェック ボックスは3ステートです。[Clear colors]プッシュ ボタンがデフォルト プッシュ ボタンです。チェック ボックス、 オプション ボタン、 プッシュ ボタンは、 アプリケーションのヘッダー ファイルで次のように定義されています。

#define IDB_BOX1 101 /* first check box */
#define IDB_BOX2 102 /* second check box */
#define IDB_BOX3 103 /* third check box */
#define IDB_REDBACK 104 /* top radio button */
#define IDB_BLUEBACK 105 /* bottom radio button */
#define IDB_CLEARBOXES 107 /* top push button */
#define IDB_CLEARBACK 108 /* bottom push button */

HBRUSH hbrRed, hbrBlue, hbrWhite;
BOOL fRedBack, fBlueBack, fClearColor; /* background-state flags */

[OK]プッシュ ボタンの識別子であるIDOKの定義は不要です。

次に示すウィンドウ プロシージャでは、 WM_CTLCOLORDLGメッセージは、 ダイアログ ボックスが描画されようとしていることをアプリケーションに通知します。ユーザーが[Clear colors]ボタンを押すと (fClearColorフラグで示されます)、 プロシージャは、 SendDlgItemMessage関数を使って、 チェック ボックスやオプション ボタンをチェック解除します。BN_CLICKED通知メッセージは、 ボタンの識別子を含んでいます。

LRESULT APIENTRY ButtonProc(hDlg, message, wParam, lParam)
HWND hDlg; /* window handle of dialog box */
UINT message; /* type of message */
UINT wParam; /* message-specific information */
LONG lParam;
{
LRESULT lState;

switch (message) {
case WM_INITDIALOG:
hbrRed = CreateSolidBrush(RGB(255, 0, 0));
hbrBlue = CreateSolidBrush(RGB(0, 0, 255));
hbrWhite = GetStockObject(WHITE_BRUSH);
return TRUE;

case WM_CTLCOLORDLG:
if (fRedBack) {
fRedBack = FALSE;
return (LRESULT) hbrRed;
}
else if (fBlueBack) {
fBlueBack = FALSE;
return (LRESULT) hbrBlue;
}
else if (fClearColor) {
fClearColor = FALSE;

/*
* Uncheck all check boxes and radio buttons.
*/

SendDlgItemMessage(hDlg, /* window handle */
IDB_BOX1, /* button identifier */
BM_SETCHECK, /* message */
0, /* check state (unchecked) */
0); /* must be zero */
SendDlgItemMessage(hDlg, IDB_BOX2,
BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg, IDB_BOX3,
BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg, IDB_REDBACK,
BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg, IDB_BLUEBACK,
BM_SETCHECK, 0, 0);
}
return (LRESULT) hbrWhite;

case WM_COMMAND:
if (wParam == IDOK) {
EndDialog(hDlg, TRUE);
return TRUE;
}

if (HIWORD(wParam) == BN_CLICKED) {
switch (LOWORD(wParam)) {
case IDB_BOX1:

/* Retrieve the state of the check box. */

lState = SendDlgItemMessage(hDlg,
IDB_BOX1, BM_GETSTATE, 0, 0);

/*
* The box-painting function is
* application defined.
*/

BoxPainter(hDlg, /* window handle */
1, /* box to paint */
lState); /* check box state */
break;

case IDB_BOX2:
lState = SendDlgItemMessage(hDlg,
IDB_BOX2, BM_GETSTATE, 0, 0);
BoxPainter(hDlg, 2, lState);
break;

case IDB_BOX3:
lState = SendDlgItemMessage(hDlg,
IDB_BOX3, BM_GETSTATE, 0, 0);
BoxPainter(hDlg, 3, lState);
break;

case IDB_REDBACK:
fRedBack = TRUE;
InvalidateRect(hDlg, NULL, TRUE);
break;

case IDB_BLUEBACK:
fBlueBack = TRUE;
InvalidateRect(hDlg, NULL, TRUE);
break;

case IDB_CLEARBACK:
fClearColor = TRUE;
InvalidateRect(hDlg, NULL, TRUE);
break;

case IDB_CLEARBOXES:
BoxPainter(hDlg, 4, (LRESULT) 0);
break;
}
}

case WM_DESTROY:
DeleteObject(hbrRed);
DeleteObject(hbrBlue);

/*
* Do not delete hbrWhite, because it is a stock
* object.
*/

break;

}
return FALSE; /* did not process a message */
UNREFERENCED_PARAMETER(lParam);
}


オーナー描画ボタンの使用

通常、 オーナー描画ボタンの親ウィンドウは、 少なくともWM_INITDIALOGWM_COMMANDWM_DRAWITEMの3つのメッセージに応答します。オーナー描画ボタンの場合は、 WM_MEASUREITEMメッセージを処理する必要はありません。

オーナー描画ボタンを描画しなければならないときは、 Windowsは親ウィンドウにWM_DRAWITEMメッセージを送ります。このメッセージのlParamパラメータは、 DRAWITEMSTRUCT構造体を指すポインタです。この構造体は、 アプリケーションがコントロールを描画するのに必要な情報をアプリケーションに供給するために使われます。DRAWITEMSTRUCT構造体のitemActionメンバとitemStateメンバは、 オーナー描画ボタンの描画方法を定義します。

次に示すコード例は、 オーナー描画ボタンのWM_INITDIALOG WM_DRAWITEMWM_COMMANDの各メッセージの処理方法を示しています。このコードは、 コントロールが選択されているかどうかによって、 2つのビットマップの内のいずれかを描画します。通常はWM_DRAWITEMメッセージのwParamパラメータを使ってコントロールを識別しますが、 この例では、 コントロールが1つだけであることを仮定しています。

LRESULT APIENTRY OwnDrawProc(hDlg, message, wParam, lParam)
HWND hDlg; /* window handle of dialog box */
UINT message; /* type of message */
UINT wParam; /* message-specific information */
LONG lParam;
{
HDC hdcMem;
LPDRAWITEMSTRUCT lpdis;

switch (message) {
case WM_INITDIALOG:

/* hinst, hbm1 and hbm2 are defined globally. */

hbm1 = LoadBitmap((HANDLE) hinst, "OwnBit1");
hbm2 = LoadBitmap((HANDLE) hinst, "OwnBit2");
return TRUE;

case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT) lParam;
hdcMem = CreateCompatibleDC(lpdis->hDC);

if (lpdis->itemState & ODS_SELECTED) /* if selected */
SelectObject(hdcMem, hbm2);
else
SelectObject(hdcMem, hbm1);

StretchBlt(
lpdis->hDC, /* destination device context */
lpdis->rcItem.left, /* x upper-left destination */
lpdis->rcItem.top, /* y upper-left destination */

/* The next two lines specify the width and height. */

lpdis->rcItem.right - lpdis->rcItem.left,
lpdis->rcItem.bottom - lpdis->rcItem.top,
hdcMem, /* handle of source device context */
0, /* x-coordinate upper-left source */
0, /* y-coordinate upper-left source */
32, /* source bitmap width */
32, /* source bitmap height */
SRCCOPY); /* raster operation */

DeleteDC(hdcMem);
return TRUE;

case WM_COMMAND:
if (wParam == IDOK
|| wParam == IDCANCEL) {
EndDialog(hDlg, TRUE);
return TRUE;
}
if (HIWORD(wParam) == BN_CLICKED) {
switch (LOWORD(wParam)) {
case IDB_OWNERDRAW:
.
. /* application-defined processing */
.

break;
}
}
break;

case WM_DESTROY:
DeleteObject(hbm1); /* delete bitmaps */
DeleteObject(hbm2);

break;

}
return FALSE;
UNREFERENCED_PARAMETER(lParam);
}

 

ボタン関数とメッセージ

ボタンに関する関数とメッセージを次に示します。

関数

CheckDlgButton

CheckRadioButton

IsDlgButtonChecked 

メッセージ

BM_CLICK

BM_GETCHECK

BM_GETSTATE

BM_SETCHECK

BM_SETSTATE

BM_SETSTYLE

BN_CLICKED

BN_DISABLE

BN_HILITE

BN_PAINT

BN_UNHILITE

DM_GETDEFID

DM_SETDEFID

WM_CTLCOLORBTN

 

▲ページトップに戻る

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