■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第40夜:小窓を開いて文字入力A そんな訳で、コマンド呼び出し部はあっさりと1行のみ追加♪ (Textengine.cpp)。コマンド処理関数は Com_text_input() とでも名前をつけておきましょう。 |
void Command_call() {
|
■ダイアログの制御 では、いよいよダイアログの制御についてです。ここはソースを見ながら注意して内容を理解してほしい部分です。ただし、見ればおわかりと思いますが、処理のボリュームとしてはそれほど大きなものではありません。 イベントハンドラとは、第2夜、第3夜でスケルトンの解説をした時にも出てきた
「メッセージをさばく」 ための関数です。イベントハンドラは、プログラムのどこからも直接呼ばれることはありません。ダイアログを開くときにシステムに登録され、それ以降、ダイアログ上でイベントが発生するたびにシステムから呼び出されます。前振りはこのくらいにして、実際にソース眺めてみましょう。 |
struct _Text_input {
_Text_input Text_input;
BOOL CALLBACK Text_input_Proc( HWND
hwndDlg, UINT msg , WPARAM wparam, LPARAM lparam )
} int Com_text_input()
} |
さて、ざっとソースを見ていただいたところで、順次解説して参りましょう。 1)コマンド処理関数 まずはコマンド処理関数 Com_text_input()
からです。この関数では、コマンド #text_input のパラメータ解釈を行った後に、DialogBox() というAPIでダイアログBOXの起動を行っています。DialogBox()
の定義は以下のとおりです。
引数の内、ちょっと気をつけなければならないのは ダイアログBOXのテンプレート です。ダイアログBOXのID (ここではIDD_DIALOG1) をそのまま渡すのではなく、 MAKEINTRESOURCE() マクロで変換して指定します。その他の引数は特に難しくはないでしょう。実行ファイルのインスタンス、および親ウィンドウ(今回はゲーム本体のウィンドウがダイアログBOXから見た親ウィンドウになります)のハンドルについては第2夜のスケルトンの項を参照してください。またイベントハンドラの関数名を指定している部分は、実際には関数のポインタ参照に相当するのですが、ここではあまり難しく考える必要はないでしょう(^^)。 なおDialogBox() は失敗すると -1、成功するとダイアログ終了時のステータスを返しますが、今回のソースでは特にチェックしないことにします。 ダイアログを閉じた後は、入力された文字列をテキスト変数に代入して終了します。 「おいおい入力された文字ってどこから来るんだ」 という方、慌てずに引き続きイベントハンドラを解説しますので後述を参照願います♪ (^^) なお、ちょっと手抜きをしてデータのセット部分は第38夜で組んだ _set_str(
) を流用していたりします。同じソースの上のほうに記述してありますので探してみてください(^^;) 2.イベントハンドラ イベントハンドラ BOOL CALLBACK Text_input_Proc() はダイアログで発生するイベントの処理を行う関数です。関数の引数 HWND hwndDlg, UINT msg , WPARAM wparam, LPARAM lparam はスケルトンの解説に出てきたイベントハンドラ WinProc() とそっくりですね。これらの引数はやはり Windows のシステムから降ってくるものです。ダイアログBOXの起動とともにイベントハンドラ (まあ監視ループとでも思って頂ければ ^^;)が機し始めます。そして同時に親ウィンドウは停止し、ダイアログの処理が終わるまで「待ち」モードに入ります。 では、イベント処理の内容をもう少し詳細に見ていきましょう。ソースでは、まずシステムから振ってきたメッセージ msg のコードを調べ、処理を振り分けています。メッセージといても、ここでは WM_INITDIALOG (ダイアログが開いた)、WM_COMMAND (ユーザーがダイアログを操作した) のチェックだけですが…(^^) ◎ WM_INITDIALOG メッセージに対する処理 WM_INITDIALOG に対する処理は、ここではエディットボックスにデフォルトの文字列を表示することです。ダイアログが開いた瞬間に特定の文字列を表示することが出来れば、デフォルトの名前をまず表示して必要があれば変更する…という操作が可能です。やはりそっけなく
EDIT などという文字列が表示されているより、山田太郎でも石川五右衛門でも、なにかデフォルトの名前が表示されていたほうがカッコイイですよね(^^)。エディットボックスの表示内容を変えるには、SetDlgItemText()
というAPIを使用します。
引数を見ると、このAPI を呼び出すにはエディットBOXのIDが必要なことが分かります。 第39夜で確認したたIDはここで使います。ダイアログBOXのハンドルはWindowsのシステムから振ってきたものをそのまま使います。 ◎WM_COMMAND メッセージに対する処理 WM_COMMAND
はユーザーがダイアログを操作したときに発生するイベントです。操作の内容は wparam に入ってきますのでそれをもとに処理を振り分けます。ところで勘のいい方はソースを見て気がつかれたかも知れませんが、個々のイベント名は実は第39夜で確認した各コントロールのIDに相当します。つまり、OKボタンが押されたなら
IDOK が、キャンセルボタンが押されたら IDCANCEL が降ってくるという具合です。
EndDialog() が実行されると、イベントハンドラでの監視ループは停止し、ダイアログが閉じて親ウィンドウの活動が再開します。これで名前入力ダイアログの操作は完了です。以外とシンプルだと思いませんか?(^^) イベントハンドラの中で降ってくるメッセージが各コントロールのIDになっているということが分かれば、ダイアログを拡張したり別途追加したり…ということは比較的容易なのではないかと思います。要領をつかむには、実際にコンパイル→実行しながら少しずつ改造などして遊んでみると良いでしょう。 では、今回はこのへんで…♪ |