その前に、MDIとは一体どんなものでしょうか。 まず、これから作ろうとしているMDIのサンプルプログラムを 見てみるとすぐに「あー、ああいうのをMDIというのか!」 とわかります。
つまり、親ウィンドウらしきものがあってそのクライアント領域
に複数の子供ウィンドウがあります。
これは、普通に親ウィンドウとその子供ウィンドウを 作ったようにも見えますが、いろいろな点でかなり違います。
例を示すと、子供ウィンドウを最大化すると子供ウィンドウのタイトルバーが なくなり、そこに表示されていたファイル名などが親のタイトルバーに 表示されます。
市販の有名ワープロはたいていMDIになっています。
いろいろ観察してみてください。
では、まずMDIプログラミングで使う用語を説明します。
親ウィンドウみたいに見えるものは、
フレームウィンドウと
呼ばれています。
子供ウィンドウは
ドキュメントウィンドウなどと呼ばれます。
また、フレームウィンドウのクライアント領域みたいに見えるところには 実は、クライアントウィンドウが張り付いて?います。
つまり、フレームウィンドウの子供が、クライアントウィンドウで、
クライアントウィンドウの子供がドキュメントウィンドウになります。
ドキュメントウィンドウ同士は兄弟になります。
従ってフレームウィンドウはドキュメントウィンドウ のおじいさんということになります。この親子関係が非常に重要です。
前置きはこのくらいにして、具体的な書き方を示します。
とまあこんな具合に作っていきます。なんだか面倒そうですが 作ってしまえば以外に簡単です。一番注意しなくてはいけないのは 自分のやりたいことをどのウィンドウに命令するかです。 特にドキュメントウィンドウのウィンドウハンドルは要注意です。1.ドキュメントウィンドウが一つもないときと1つ以上 存在するときのメニューリソースを作っておく 2.普通の親ウィンドウを作る感じでフレームウィンドウを作る 3.フレームウィンドウのプロシージャを作る A.CLIENTCREATESTRUCT, MDICREATESTRUCT構造体変数を宣言しておく B.フレームウィンドウができたらすぐに(WM_CREATE)クライアント ウィンドウを作る(既成の"MDICLIENT"クラス) C.ドキュメントウィンドウを作る命令(メッセージ)が来たらMDICREATESTRUCT構造体 メンバを定義してクライアントウィンドウにWM_MDICREATEを送る D.ドキュメントウィンドウを閉じる命令が来たらアクティブな ドキュメントウィンドウハンドルを調べてそのウィンドウに WM_MDIDESTROYメッセージを送る E.ドキュメントウィンドウをすべて閉じる命令が来たら EnumChildWindows関数で「全部閉じる」コールバック関数を定義する。 このコールバック関数の中身はある程度ワンパターン G.自分で処理しないメッセージはDefFrameProcに任せる 4.ドキュメントウィンドウのプロシージャ WM_MDIACTIVATEメッセージが来たら条件に応じてクライアントウィンドウのメニューを替える 5.クライアントウィンドウのプロシージャは既製品のウィンドウクラスなので 自分で書く必要なし!
では、次回より具体的にMDIを作っていきます。
[SDK Index] [総合Index] [Previous Chapter] [Next Chapter]
Update Oct/18/1997 By Y.Kumei