2009年07月16日

第0x06回 お手軽ウィンドウ〜ダイアログ〜

Windowsでは、全てウィンドウによって成り立っていることは、
これまでにお話したとおりです。
しかし、各アプリケーションでウィンドウを出し、
中に色々描画をし、処理をするということを毎回書くのは大変です。

ほとんどのアプリケーションは、
ボタンを出し、ユーザにテキストなどを入力させ、処理をする。
こんな流れになっていると思います。
Windowsでは、これら定型のインターフェースをコモンコントロールとして
用意されています。
これらコモンコントロールが集合したウィンドウのことを、ダイアログと呼びます。

それでは早速、ダイアログを作成していきましょう。


(サンプル)
sample006.zip


まず、前回同様、プロジェクトにリソースを追加します。
今回作成するのはダイアログなので、「Dialog」を選択します。

win006_001.png

すると下のようにダイアログのフォームが出てきます。
初期状態では、「OK」ボタンと「キャンセル」ボタンのみが配置されています。

win006_002.png

ここで、ダイアログのプロパティをいくつか変更します。
Center   : ダイアログを中央に配置するか(ここでは「True」を指定)
Visible : 初期状態でダイアログを表示するか(ここでは「True」を指定)
Caption : タイトルバー文字列 (ここでは「オプション」を指定)

次にコントロールを追加します。
まず下のように「Static Text」を選択し、ダイアログの適当な場所に配置してください。
スタティックとは、文字列や画像などをダイアログに配置するコントロールです。
表示する文字列は「Caption」で変更することができます。

ちなみに、「Caption」とはウィンドウのタイトルのことなのですが、
コントロールでは、表示する文字列などに置き換わります。

win006_003.png

同様に、下のようにコントロールをいくつか配置します。
今回は、「Check Box」「Edit Control」「Group Box」を使用します。
見てわかるように、その他にも様々なコントロールが用意されているので、
アプリケーションの動作に応じて、適宜配置していきます。

win006_004.png

配置が終了したら、左上のボタンを押し、ダイアログの概観を確認します。
これで、インターフェースの実装が終わりました。
このリソースを元に、実際にプログラムに組み込んでいきます。


ところで、ダイアログにはモーダルダイアログモードレスダイアログ
2種類が存在します。
モーダルダイアログとは、ダイアログが表示されている間、他の操作ができなくなる
ダイアログのことです。
例えば、ファイルを選択するダイアログなどが、これにあたります。
モードレスダイアログでは、その反対で、ダイアログが表示されている間でも、
他の操作ができます。

今回は、オプションの設定ダイアログという想定で作るので、
設定中に、他の操作をされるのは困るので、モーダルダイアログで表示します。
モーダルダイアログを表示するには、次のようにします。
DialogBox( g_hInstance , (LPCWSTR)IDD_DIALOG1 , hWnd , DialogProc );
関数の引数は次のようになります。
第1引数:アプリケーションのインスタンスを指定
第2引数:表示するダイアログのリソース名を指定
第3引数:表示するダイアログの親ウィンドウを指定
第4引数:コールバック関数を指定

コールバック関数は次のように宣言します。
BOOL CALLBACK DialogProc( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam );
基本的には、ウィンドウのコールバック関数と同様ですが、
戻り値がBOOLなことに注意してください。

DialogBox()関数でダイアログを呼び出し、
コールバック関数にダイアログに対するメッセージを処理するのが
基本的な流れになります。

今回は次のメッセージを処理します。
WM_INITDIALOG:ダイアログの初期化時に呼ばれるメッセージ
WM_COMMAND :メニュー(ボタン)が選択されたときのメッセージ
WM_INITDIALOGは、DialogBox()関数を呼び出したときに即時に呼ばれるメッセージです。
このメッセージに応答して、ダイアログの初期化を行います。
ここで、ダイアログの各アイテムの状態を設定したりします。

ダイアログに配置されているコントロールを操作するためには、
ハンドルを取得しなければなりません。
// ダイアログアイテムのハンドルを取得する
HWND hEdit = GetDlgItem( hWnd , IDC_EDIT1 );
HWND hCheck = GetDlgItem( hWnd , IDC_CHECK1 );
GetDlgItem関数を呼び出すことにより、コントロールのハンドルが取得できます。
コントロールの所有権はダイアログが持っているので、
このハンドルをReleaseする必要はありません。

エディットボックスの中に初期文字列を指定するには、
Captionの内容を変更する必要があります。
// エディットボックスにテキストを設定する
SetWindowText( hEdit , g_szName );
SetWindowText()関数は、ウィンドウのタイトルを変更する関数です。
この関数は、エディットボックスに限らず
「Static Text」や通常のウィンドウのタイトルを変更するのに使用します。

逆にエディットボックスの中の文字列を取得するには、
Captionの内容を取得する形になります。
// エディットボックスからテキストを取得する
GetWindowText( hEdit , g_szName , sizeof( g_szName ) );

同様にチェックボックスもハンドルを使い、
操作をするわけですが、実はチェックボックスに対する操作は、
Win32APIの関数としては用意されていません。
ほとんどのダイアログのコントロールに対する処理は、
関数を用いず、直接メッセージをコントロールに対して送ることによって対話します。

// チェックボックスを設定する
if( g_bCheckSound )
SendMessage( hCheck , BM_SETCHECK , (WPARAM)BST_CHECKED , 0 );
else
SendMessage( hCheck , BM_SETCHECK , (WPARAM)BST_UNCHECKED , 0 );
// チェックボックスを取得する
if( BST_CHECKED == SendMessage( hCheck , BM_GETCHECK , 0 , 0 ) )
g_bCheckSound = true;
else
g_bCheckSound = false;
SendMessage()関数は、メッセージを送る関数です。
第1引数:メッセージを送るウィンドウのハンドル
第2引数:送るメッセージ
第3引数:メッセージに関連するWPARAM
第4引数:メッセージに関連するLPARAM

チェックボックスには、次の2つのメッセージが用意されています。
BM_SETCHECK  チェックボックスを設定するメッセージ
 WPARAM:設定する値(BST_CHECKEDならチェック、BST_UNCHECKEDならチェック解除)
 LPARAM:特に使用しない

BM_GETCHECK  チェックボックスの状態を取得するメッセージ
 WPARAM:特に使用しない
 LPARAM:特に使用しない
 戻り値として、現在の状態が返ってくる

さて、通常のダイアログでは、「OK」ボタンが押されると状態が保存され、
「キャンセル」ボタンが押されると、状態が保存されないという作りになっています。
WM_COMMANDの中で、その処理を追加し、「OK」ボタンが押された場合のみ、
状態を保存するという作りにします。

そして、ダイアログを終了させるためには、次の関数を呼びます。(モーダルダイアログの場合)
// ダイアログを終了する
EndDialog( hWnd , 1 );
第2引数で指定した値は、そのままDialogBox()関数の戻り値となります。
ダイアログボックスの呼び出し元で、状態によって処理を分岐させる場合に
用いることになります。


今回は、ダイアログで設定した内容をグローバル変数に保存しました。
次回では、この設定の内容をファイルに保存するように改造してみます。


ラベル:ふわ猫
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。