さて、前回作成した窓に引き続き、今回もまたシンプルな窓の実装を紹介します。 この時点でご興味の薄れた方、残念ですがごきげんよう、また次回お会いしましょう。 戻る さて、改めてこんにちは 前回、 MessageBox 関数を用いた窓(メッセージボックス)を表示させましたが、 今回はもう少しグレードを上げて(?)、メッセージボックスの親分格にあたるダイアログボックスで窓を表示させます。 まぁ、気張ったところで用いる関数( Windows用API、Win32API )は、前回と同様一つなので気楽にいきましょう。当然のことですが、今回も前回と同じように MSDN の焼き直しになることは明らかだし・・・ 取り敢えず気を取り直して、ながながと MSDN の焼き直しにお付合いください。 今回取り扱う関数は、すばり DialogBox です。 ところでこの DialogBox の語源ですが ・・・・ Dialog とは、 まずこの関数が定義されているヘッダーは winuser.h で、インポートライブラリは user32.lib になります。ヘッダーやライブラリなる用語が分からない方は申し訳ございませんが、C 言語の参考書等を参照してみてください つぎにこの関数の仕様ですが、 簡単に説明しますと、DialogBox 関数はダイアログボックステンプレートリソースからモーダルダイアログボックスを作成します。ほら、簡単でしょう?・・・・どこがじゃ! ひとまずダイアログテンプレートリソースの説明から致しましょうか ( MSDN を要約すると)DialogBox 関数に受け渡すダイアログボックステンプレートとは、 ダイアログボックスの特性を指定したものだそうです ・・・ もっともテンプレートって云うほどだからそうじゃないと意味が通じないじゃん さて、テンプレートに対してダイアログウィンドウの特性を与えるわけですが 具体的には、サイズ・表示位置・ウィンドウスタイル・ダイアログウィンドウ上に追加されるコントロールタイプなどの位置と状態を指定します。 百聞は一見にしかずってなことで簡単な例ですが、以下にテンプレートのサンプルを上げます。
でも、安心してください。市販の開発環境の大半には、テンプレートを自動生成してくれるダイアログエディタなるツールが存在するはずです。 このツールを用いれば上記のテンプレートなんて簡単に作成できちゃいます ・・・たぶんそのはずです。ちがったらごめんね ちなみにわたくしが使っている VisualStudio の機能ですと、以下のことができます。 1.ダイアログボックスの表示位置・サイズの調整ほら〜、このような強力無敵な(?)ツールを用いることで、簡単にしかもお手軽にダイアログボックスの外観を整えることができるでしょう? 後は、作成したダイアログボックステンプレート名を DialogBox 関数に渡せば OK! では改めまして、DialogBox 関数についていろいろと見てみましょう。 まずは DialogBox 関数の関数定義を int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc ); hInstance:アプリケーションのインスタンスハンドル この関数 I/F の仕様を見る限り、MessageBox 関数より強力なことは一目瞭然ですね でぇ、そこを踏まえて関数の I/F をよ〜っく見てみますと、最後の引数がコールバック関数への入り口になっているかと思われます。 改めて云われるまでもなく、コールバック関数へのエントリーが存在するのに気付かれた方もいるとは思いますが・・・ このコールバック関数が実装されている点が、前回用いた MessageBox 関数との大きな相違点です。これによって生成される 窓 に対して EventDriven な環境が実装されます。 ちなみに MSDN 上では、コールバック関数のことを OS から発信されるメッセージを受信する関数であると説明しています。コールバック関数やイベント駆動に関しては、例によって例の如く、これ以上言及するつもりがないのでごめんなさい。 さて、先に進みましょう。 関数 I/F から言えることは、繰り返しになりますが、コールバックが実装されているため、作成された窓は本格的なメッセージ駆動型 ・・・ イベント駆動型モジュールとなります。 ちなみに MSDN の説明を補足しますが、 この DialogBox 関数は、指定されたコールバック関数が EndDialog 関数を呼び出してダイアログボックスを閉じるまで、制御をメインスレッドに返しません ・・・・ 補足終わり さてさて、MSDN では DialogBox 関数のことを、DialogBox マクロと明記されていますが ・・・ 確かに DialogBox はマクロだったりします。 マクロなる語の意味は、ちーっと話が飛躍しますが、コンパイラーがサポートするプリプロセッサの機能で、 #define で呼び出された機能です。役割は、単純に説明しますと値の置き換えです。さて、いろいろと調べてみると DialogBox とは、CreateWindowEx 関数を使って実装されているようです。 でも ・・・ 直接、grep なんぞして VC の include ディレクトリをソートしてみますと、WINUSER.H 上に次の如く定義されていました。 興味の無い人は先に進んでください。 最後、とどめです。 WINUSERAPI int WINAPI DialogBoxParamA( HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent , DLGPROC lpDialogFunc, LPARAM dwInitParam); WINUSERAPI int WINAPI DialogBoxParamW( HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent , DLGPROC lpDialogFunc, LPARAM dwInitParam); 取り敢えずこんな感じでした・・・・ さて、行き成り実装して見ましょう。(百聞は一見に ・・・・) え〜っと、ソースが小さくって見難いときは、取り敢えず以下のソースをカットアンドペースとしてメモ帳にでも貼り付けてから参照してください。
上記がプログラムの骨格、所謂ソースコードと呼ばれるものです。 下はリソースファイルです。
最後にヘッダを
さて上記の三本のファイルをコンパイラーに渡すと ・・・ ←こんな画面が出てくると思います。 しかもソースの骨格、つまりは窓を表示させている箇所は一行に過ぎません。 DialogBox(hInstance, (LPCTSTR) IDD_DIAGGUI, NULL, (DLGPROC) DialogProc); この一行の呼び出しで、窓が画面上に現れて、以後、イベントをトラップすると自動的にコールバック関数に渡されます。
関数内の動きにつきましてはおいおいということで・・・・おぃおぃ! 取り敢えずは気にしないでください。 ポイントは DialogBox 関数です! この関数を使うことで MessageBox 関数よりもより多くのことが可能になります。 DialogBox 関数の紹介は、こんなもんで如何でしょうか? 今回はこの辺りで締め括らせていただきます。 |
ご意見、ご感想、ご要望等々はこちらのメールアドレス takamegu@lycos.ne.jp までご一報ください。
では、また
高松 恵