スプリッタウィンドウの上にダイアログ

[戻る]
まかろに 2004/10/20(水) 16:04:12
いつもお世話になっています。

表題の通り、スプリッタウィンドウの上にダイアログを置こうとしています。

____________________
|         |         |
|         |         |
|         |         |
|--------------------
|         |         |
|         |         |
|         |         |
---------------------

このような感じで、4つとも CView を割り当てています。
そこで左下にビューを囲うような大きさのダイアログを置きたいのですが
座標がうまくとれません。
ソースの方は、 左下のビューを仮に CLdView とすると

BOOL CLdView ::PreCreateWindow(CREATESTRUCT& cs) 
{
  m_dialog.Create(IDD_DIALOG1, this);
  m_dialog.SetWindowPos(&CWnd::wndTop, cs.x, cs.y, 256, 288,         
              SWP_SHOWWINDOW );
    
  return CView::PreCreateWindow(cs);
}

となっています。
cs.x . y 共に0なのでディスプレイの左上にダイアログが出てしまいます。
常にこのビューにくっついていかせたいのですが
どのようにすればよろしいでしょうか。
よきアドバイスをお願いいたします。

<開発環境>
Windows XP
Visual C++ 6.0   MFC
を使用しています。

シャノン 2004/10/20(水) 16:38:18
そのビューの上にダイアログをくっつけたとして、そのビューは操作できるのですか?
左下のビューを CFromView にしちゃえば…とか思ったのですが。

まかろに 2004/10/20(水) 18:12:54
シャノンさん > アドバイスありがとうございます。

CFormView を使った方がはるかにやりやすそうなので
そちらに変更してみたいと思います。

そこでさらに質問なのですが、最初に CFormView にセットしたダイアログを
別のダイアログに差し替えるということは可能なのでしょうか?

今考えているのが、左下と右下両方を CFormView にして
左下にいくつかのボタンを配置、押されたボタンによって
右下のペインに表示されているコントロールが入れ替わる
とういうものなのですが、右下のコントロールの数がかなり多くなりそうで
1つのダイアログに配置してのON/OFFではどうしても見づらくて
配置がしにくいと思われますので、いっそのことダイアログをボタンの数だけ用意し
丸々差し替えれればなぁと思っています。

もし可能ならば、その方法を教えて頂けませんでしょうか?
よろしくお願いいたします。

シャノン 2004/10/20(水) 18:31:45
できるかできないかといえば、できます。
が、俺は MFC についてはあまり突っ込んだ勉強をしていないので、どうやるかはわかり
ません。
お役に立てず、申し訳ありません。

このへんが参考になるでしょうか
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vccore/html/vcconaddingmultipleviewstosingledocument
.asp

dairygoods 2004/10/20(水) 18:55:31
入れ替えが必要なら、ダイアログをCViewの中に貼り付ける方法もアリかも知れません。
で、最初に戻って、ダイアログリソースのプロパティにて、
「スタイル」が「チャイルド」になっていますでしょうか?

まかろに 2004/10/20(水) 19:34:08
シャノンさん >
  お役に立てずなんて、とんでもありません。
 わからない自分が悪いわけですから。
 貴重なご意見を頂いていますし、大変感謝しています。

dairygoosさん >
 チャイルド…になってませんでした。
 変更してみたところ、ピタッとビューの左上にくっついてくれました。
 ウィンドウを動かしてもちゃんと付いてきてくれます。

というわけで、差し替えも意外と簡単にできそうな
CView にダイアログを張り付ける 最初の方法でやってみようかと思います。
( シャノンさん、せっかくのご教示すいません )

ちなみにですが、CSplitterWnd のメンバに DeleteView() というのがありますが
これと CreateView を使って、ビュー自体の差し替えは…などと思いました。
この方法ってどうなんでしょう?初期化でもないところで使うのは
若干気持ち悪いなぁ…という気もしまして、ちょっと皆さんの意見を
聞いてみたかったりと思います。

解決済みなところ、しつこく引っ張ってすいません。
ご意見お聞かせ頂ければ幸いです。

たいちう 2004/10/21(木) 09:48:51
> ちなみにですが、CSplitterWnd のメンバに DeleteView() というのがありますが
> これと CreateView を使って、ビュー自体の差し替えは…などと思いました。
> この方法ってどうなんでしょう?初期化でもないところで使うのは
> 若干気持ち悪いなぁ…という気もしまして、ちょっと皆さんの意見を
> 聞いてみたかったりと思います。

私なら右下のCFormViewを複数作って差し替えると思います。(試したことはないです)
CMainFrmでCViewを差し替えることができるので、
CSplitterWndでも似た方法でできるのではないでしょうか。
DeleteView()等を使うのかどうかはわかりません。

今、MSDNのCD-ROMが手元に見当たらないのでサンプルがないのですが、
VIEWEXでそのようなことはしていなかったでしょうか?(曖昧な記憶)

右下のCFormViewの種類数がそんなに多くないのなら、CSplitterWndのペイン数を
表示に必要な以上に作成しておいて、必要なタイミングでペインの場所と表示・非表示
を切り替えて、CFormViewの切替をすることはできます。
(これはやったことがありますが、私には難しかったです。参考にしたページ。
 http://www.codeguru.com/Cpp/W-D/splitter/article.php/c1543 )

いずれも労力的に見合うかどうか分かりませんので、
ダイアログの差し替えが妥当な方法でしょうか。
興味と時間がありましたら試してみてください。

ゆう 2004/10/21(木) 10:07:40
個人的な意見ですが、スプリッタでCFormViewやダイアログを使うのは
以外に使い勝手が悪かったです。
サイズ変更するとボタンが隠れちゃってスクロールさせなくては
ならなくなったり...
左下と右下、共にダイアログバーにしておいたほうが便利ではないでしょうか。
ドッキングもできるし、表示、非表示の切り替えもスムーズだし...

まかろに 2004/10/21(木) 15:09:36
皆様ご意見ありがとうございます。

ダイアログバーの方がという意見を頂きましたが
普通のダイアログと比べてどの辺りが便利なのでしょうか?
詳しく教えていただけるとありがたいです。

あと、質問の趣旨と少し違うのですが
分割したウィンドウにビューを設定するとき(CreateView)に指定した
ビューのサイズと、同じ大きさのダイアログを張り付けたいのですが
ダイアログエディタで同じ大きさの物を作ると、明らかにエディタの
方がサイズが大きくなるのはなぜなんでしょうか?

低レベルな質問かもしれませんが、すごく不思議です。
ご教示よろしくお願いします。

dairygoods 2004/10/21(木) 15:25:22
> ダイアログエディタで同じ大きさの物を作ると、明らかにエディタの
> 方がサイズが大きくなるのはなぜなんでしょうか?

ダイアログエディタでの大きさというのがステータスバーに表示される
サイズ表示のことでしたら、それはダイアログ単位(DLU)というものです。

まかろに 2004/10/21(木) 15:59:38
ダイアログ単位ですか…なるほど、納得しました。

ビューの大きさはユーザーにころころ変えられると思うので
結局コントロールの座標は自前で計算することになりそうです。
でも、モヤモヤがとれてすっきりしました。ありがとうございます。

もう一件に関する意見が頂けるかもしれないので
一応未解決ということで…

ゆう 2004/10/21(木) 18:16:58
なんか遅ればせながら...

>ダイアログバーの方がという意見を頂きましたが
>普通のダイアログと比べてどの辺りが便利なのでしょうか?
>詳しく教えていただけるとありがたいです。

先程も書きましたが、ダイアログを貼り付けた場合、Viewの大きさが変わった時に
中身の一部が見えなくなったりします。
その都度スプリッタの区切りを調整するのが鬱陶しいと思ったりするのですが、
個人的な印象ですのですので、人それぞれかもしれません。

ダイアログバーはダイアログをツールバーの様にドッキングして使う物で、
VC++のワークスペース(やアウトプットウィンドウ、その他etc)みたいな物です。
(正確には違いますが。それらはCReBar派生? )
Viewよりも優先して表示されますし、表示、非表示の切り替えが簡単にできます。

ただ、ドッキングさせると左右の場合はそのダイアログの幅、上下の場合は高さ分の面積を
占有するので、良し悪しは好みの問題かもしれません。

まかろに 2004/10/21(木) 18:53:59
ゆうさん >

物分りが悪くて申し訳ないのですが
ダイアログバーに変更ということは
2x2で分割してたウィンドウを、2x1にして
大きめのダイアログバーをメインのフレームの下部にくっつければいい
ということですか?

古いスレッドには追加発言できません。