どうも以前はお世話になりました。
今回も初歩的な質問だと思いますがよろしくお願いいたします。
現在、windows2000、SDI、VC++6.0で開発を行っているのですが、
SDIでMDIのように子ウインドウを作ることができるのでしょうか。
MDIのスケルトンプログラムを参考にして考えてみたのですが、
いつまでも進展しなかったため質問させていただきました。
どなたかご教授お願いいたします。
M&Kさんご意見どうもありがとうございます。
そのページの存在は知っていたのですが、
私はSDKでの開発を行ったことがないため、
そのページに書いてあることがいまいち理解できなかったのです。
MFCでの開発にSDKで機能を追加していくということはできるのでしょうか。
また、MFCによるやり方があるページなどありましたら教えていただけたら幸いです。
よろしくお願いいたします。
> SDIでMDIのように子ウインドウを作ることができるのでしょうか。
どの程度「MDIのような」子ウィンドウを作りたいのでしょうか?
dairygoodsさん以前はお世話になりました。
MDIのスケルトンプログラムのように
何もしないものを試しに作ってみようと思いまして。
規模の大きなものは作れないとか制限があるのでしょうか?
> 規模の大きなものは作れないとか制限があるのでしょうか?
いいえ、MDI子ウィンドウのどの部分を真似たいのが
分からないのです。
単にタイトルバーをつけたいのか、
または、選択した子ウィンドウに応じてメニューやツールバーを
変化させるようなことをしたいのか、などなど。
とりあえず、見た目だけのウィンドウを作るなら、こんな風にします。
// メンバ変数
CWnd subWnd;
// 初期化
CRect rc(10, 10, 100, 100);
subWnd.Create(NULL, Child, WS_OVERLAPPEDWINDOW|WS_VISIBLE, rc, this, 123);
以前質問させていただいたのですが、
フローチャートを書くとその処理の実行結果を出すという
プログラムの続きをやっています。
今回サブルーチンの機能を追加しようと思いまして
今までメインウインドウにフローチャートを描いていたのですが、
新しく子ウインドウを作り、
それにサブルーチンのフローチャートを描けるようにしたいと思っています。
だからメインウインドウとほぼ同じ機能をもった子ウインドウを
作ることになると思いますので、
>選択した子ウィンドウに応じてメニューやツールバーを
>変化させるようなこと
は考えていません。
新しく作る子ウインドウごとに名前を自由につけることができる
くらいの機能があればいいと考えています。
>新しく作る子ウインドウごとに名前を自由につけることができる
>くらいの機能があればいいと考えています。
なら、すでに紹介されているように、SDI の View を親ウィンドウとして WS_CHILD ス
タイルを付加したウィンドウを作ればOKですね。
簡単には、View のメンバに
CWnd m_wndChild;
なんてのを持たせて、View の OnCreate() あたりで
m_wndCHild.CreateEx (0, 0, Child, WS_CHILD|WS_VISIBLE, CRect(0,0,128,128),
this, 123);
とか。
hanabiさん その後いかがですか?
私も興味が有ったので渋木宏明(ひどり)さんのアドバイス通り、
トライしてみました。
m_wndCHild.CreateEx (0, 0, Child, WS_CHILD|WS_VISIBLE,
CRect(0,0,128,128), this, 123);
のままだと何も表示されず、
m_wndCHild.CreateEx (0, 0, Child, WS_CHILD | WS_CAPTION | WS_VISIBLE,
CRect(0,0,128,128),this, 123);
に変更したらうまく行きました。
報告までです。
返事が遅くなり申し訳ありません。
渋木宏明(ひどり)さんとM&Kさんのおっしゃられたとおりにしてみたら、
無事子ウインドウが生成されました!
本当にありがとうございました。
追加の質問なんですが、
今回Viewのほうに書いたのは初めから表示するからですよね?
MDIのように「「新規作成」ボタンを押したときにウインドウを作成する」
という風にするときは、新しくウインドウ用のクラスを作成したほうがいいんでしょうか?
宜しくお願いいたします。
> MDIのように「「新規作成」ボタンを押したときにウインドウを作成する」
> という風にするときは、新しくウインドウ用のクラスを作成したほうがい
> いんでしょうか?
クラスを作成することと、
ボタンを押したときにウィンドウを作成することは別問題です。
ボタンを押したときにウィンドウを作成するには、
OnCreateの代わりにボタンを押したイベントハンドラでCreateすればよいです。
また、CWndはウィンドウの基本機能しかもっていませんから、
ウィンドウに何か表示したり処理をさせたりしたければ、
派生クラスを作ることになるでしょう。
ご回答ありがとうございます。
>ウィンドウに何か表示したり処理をさせたりしたければ、
>派生クラスを作ることになるでしょう
今回の場合ですとCFrameWndを基本クラスにしてクラスを作成すればいいんでしょうか?
今実際にやってみようとしたのですが、
「Create関数」と「OnCreate関数」の違いがMSDNライブラリを見ても
いまいち理解できません。
この2つの関数に大きな違いはありますか?
> 今回の場合ですとCFrameWndを基本クラスにしてクラスを
> 作成すればいいんでしょうか?
CFrameWndの独自機能を使いたい場合は、CFrameWndを派生します。
これまでの話からは子ウィンドウにCFrameWnd独自の機能が必要とも
思えませんので、CWndで良いと思いますが。
> 「Create関数」と「OnCreate関数」の違いがMSDNライブラリを見ても
> いまいち理解できません。
Create関数を呼び出すと、ウィンドウが作成されます。
OnCreate関数はCreate関数が呼び出されてウィンドウが作られたときに
呼び出されます。
MSDNの解説は、OnCreateを呼び出す側の立場で書かれているので、
分かり辛いですね。
>CFrameWndの独自機能を使いたい場合は、CFrameWndを派生します。
>これまでの話からは子ウィンドウにCFrameWnd独自の機能が必要とも
>思えませんので、CWndで良いと思いますが。
なるほど。それではCWndもやってみようと思います。
>Create関数を呼び出すと、ウィンドウが作成されます。
>OnCreate関数はCreate関数が呼び出されてウィンドウが作られたときに
>呼び出されます。
ということは、OnCreate関数は単独では使えないということですかね?
通常ウインドウを作成するときはどちらを使うほうがよいでしょうか?(用途により使い
分けるのでしょうけど)