VC++6.0(SP5),WinXP
ダイアログを使ったプログラムを作成中です。
いくつかのダイアログで一部共通の処理(画面)があるので、その部分を子ダイアログ
(そんな表現が適切かどうか・・・?)としてプログラムをすっきりさせたいと思って
います。
ダイアログのプロパティでスタイルが「チャイルド」や「オーバラップ」にすれば、そ
のようなことを実現できるのではと思っているのですが、使い方を検索しても見つかり
ません。
このようなことはできないのでしょうか?
-----------------------------------------
| --------------------------|
| |ここを ||
| |1つのダイアログとして||
| |共通にしたい。 ||
| --------------------------|
| |
| |
-----------------------------------------
当方VS2005ですが,子側のダイアログを
リソースエディタでのプロパティで
・Control をtrue
・Style を子
にし,親ダイアログ側で
CDialog::Create(子ダイアログID,this);
とすれば,図示されているような状況になるようです.
が……
MFCにあまり詳しくないので,そういうものなのかどうか不明ですが,
次のような変な?感じに.
子ダイアログにボタン(IDC_BUTTON_TEST)を配置し,そのボタンについて
親ダイアログと子ダイアログにイベントハンドラを作成してみたところ,
(1)クリックしたとき
(2)フォーカスがボタンにあるときにスペースを押したとき
と
(3)フォーカスがボタンにあるときにEnterを押したとき
とで動作が違うようです.
(1)と(2)は子ダイアログに,(3)は親ダイアログにメッセージが来ているようです.
それじゃあ,(1)と(2)のときは子から親に通知してやろう,と思い,
子ダイアログのクラスのOnBnClickedButtonTest()にて
::PostMessage( GetParent()->GetSafeHwnd(), BN_CLICKED, MAKEWPARAM
(IDC_BUTTON_TEST,BN_CLICKED), LPARAM(GetDlgItem(IDC_BUTTON_TEST)->GetSafeHwnd
()) );
とか書いてみましたが,親のハンドラが呼ばれません.
読み返して気付いた…
最後のPostMessageの第二引数がバグっている.
BN_CLICKEDじゃなくてWM_COMMANDですね.
なんでEnterだけ扱いが違うのか不明ですが,ちゃんと親に通知できます.
簡単にできますし、ごく普通の方法です。
1.まず、子DLGのStyleを「子」=WS_CHILDにします。無論Borderもいりませんね。
2.次にこの子DLGを親DLGのメンバにします。
3.最後に親DLGのOnInitDialog()でこの子DLGをクリエイトします。
親DLG : public CDialog
{
protected : 子DLG dlg_child;
};
親DLG::OnInitDialog()
{
dlg_child.Create( 子DLGのID, this);
}
てなかんじ。
さて、これができても、様々な問題が発生するはずです。
とりあえず表示できるところまでやってみましょう。
みなさん、ありがとうございます。
これらについては、みなさんは何で勉強されたのでしょうか?
お薦めサイトや書籍がありましたらご紹介いただけたら幸いです。
多分、特に勉強した覚えはありませんが、
1.Windowsのウインドウには親子関係がある。
2.CreateWindow()で、渡したHWNDが親、作成されたHWNDが子。
3.WS_CHILDスタイルのHWNDはその親のクライアント領域内にしか表示できない。
4.ダイアログは特殊なコールバックを持つウインドウの一種。
という基本的知識の組み合わせと、実体験のみが必要です。当然、
5.MFCはSDKをC++でカプセル化しただけ。
というのも必要。
実装の方法論から入るのではなくて
実際にWindows上でどういう仕組みで動いているのかと言う部分を
理解した上で仕組み上こうなっているからこういう実装になると
いう方向で覚えて行った方が応用がきくと思います。
どうしても実装方法だけで話を進めてしまいがちですが、
本当に理解すべきなのは仕組みの部分であって
実装方法に関しては仕組みの部分が土台にあっての話だと思いますよ。
仲澤@失業者さん、PATIOさん、こんばんは
>という基本的知識の組み合わせと、実体験のみが必要です。当然、
>本当に理解すべきなのは仕組みの部分であって
>実装方法に関しては仕組みの部分が土台にあっての話だと思いますよ。
お二方の意見に賛成です。
で、基礎を知りたいのですがなかなかそのような資料が無く
みなさん何で勉強されているのかなと思った次第です。
最近の方が何を見ているのか知りませんです。
自分はWindows2.1のころからやっているのですが、当時は、Windowsの動作
についての詳しい説明がSDKに付属していました(冊子です)。
手元にあるVS。6.0、.NET2003、2008のマニュアルをざざっと見てみましたが、
似たような内容の説明を見つけることができませんでした。
う~む(vv;)。よくないですねぇ。
私の場合、イベントドリブンだとかWindow周りの実装関係の話は
OS/2の書籍で勉強しました。多分、OS/2付属の書籍だったのではと思います。
分厚いのが数冊有りました。Windowsの本を読んだのはその後ですね。
最近の本は?と聞かれると結構困るかも。
基本的な仕組みの話でしたら「猫でもわかる」シリーズの書籍なら
色々説明があるんじゃないかと思います。
本屋で中身を確認してみてはどうかと思います。
更に突っ込んだ話となるとインサイド・チョメチョメ系の本でしょうか。
かなり突っ込んだ内容になると思うので読みこなすには時間が必要になるかもですが。
インサイド Microsoft Windows 第4版(上・下)
Windowsの仕組み立てと言うのは実際の話よく出来ていると思います。
欠点がないとは言いませんが、パーソナルコンピュータを
うまく使うためにどういう仕組み立てをすれば良いのかと言う部分に
関してはなるほどこう考えたのかと言う部分が多いと思っています。
最近のSDKについてくる資料にはこの辺の話が詳しく載っているのは
確かに見た事がないです。ホントはとても大事な部分なんですけどね。
マニュアルのできは、確かにOS/2のほうが良かったと思います。
SDKの関数も、そのカテゴリでプリフィックスが付いていてわかりやすいし。
最初からフレームウインドウとクライアントウインドウを分けてある
ところなんか、さすがIBMといった感じでした(とほい目)。