ダイアログベースで作成したプロジェクトからCFormViewの呼び出し

[戻る]
H.N@ch 2006/01/13(金) 10:52:27
初めめて投稿します。
開発環境はOS:WIN2000 コンパイラ:VC++.NETです。

現在作成、ダイアログベースでプロジェクトを作成したのですが、画面のサイズ変更を任意に出来るよ
うにしないといけない必要性がでてきました。(ダイアログに書かれている文字も含めて)
そこでCFormViewのクラスを作成して、ダイアログから呼び出そうと思いつき、いろいろ試している
のですがうまくいきません。
やっているうちに、ダイアログベースでプロジェクトを作成するとCFormViewクラスは呼べないのかなとも
思い始めました。
やり方をご存知の方がいましたら是非ご教授いただきたく思います。
ご意見よろしくお願いいたします。

επιστημη [E-Mail] 2006/01/13(金) 10:58:20
SDI/FormViewベースで作り直すのが結局近道なんじゃないかと。

Ban 2006/01/13(金) 10:59:39
> やっているうちに、ダイアログベースでプロジェクトを作成するとCFormViewクラスは
> 呼べないのかなとも思い始めました。

Document-View専用のものですから、独自にダイアログベースをSDIにするくらいの
ポートをしないと無理です。

H.N@ch 2006/01/13(金) 12:09:29
επιστημη さん、Ban さん早速の回答ありがとうございます。

ちょっと質問のしかたが悪かったですね。申し訳ありません。
実施したいことは、すでに作成しているダイアログから新しいダイアログ又はCFormView等の画
面を呼ぶもので、新しい画面だけサイズ変更が出来ればいいというものです。

どうにもならなかった場合は、その画面だけCFormViewベースのSDIでアプリケーションを作成し、ダイア
ログベースで作成したアプリケーションから呼ぶしかないかなと考えています。
でも出来れば管理等の関係上ひとつのアプリケーションで実施したいなと考えおりこのような質問を投
稿させていただきました。

申し訳ありませんが再度アドバイスをよろしくお願い致します。

dairygoods 2006/01/13(金) 12:13:20
> 新しい画面だけサイズ変更が出来ればいいというものです。

サイズ変更だけが目的で CFormView を使おうとしているのでしたら、
そんなことしなくても、ダイアログリソースのプロパティで
境界線を「サイズ変更枠」にすればできます。

επιστημη [E-Mail] 2006/01/13(金) 12:17:39
ですね。"大きさ可変のダイアログ"にするだけ。
# ホントにそれ"だけ"が目的ならば。

H.N@ch 2006/01/16(月) 12:18:54
dairygoodsさん、επιστημηさんご回答ありがとうございます。
サイズ変更時にはもちろんダイアログ内に書かれている文字やコントロールも移動させなければ
いけません。
ダイアログのサイズ変更について調べて、実際にいろいろやってみると、スクロールやサイズ変
更時再描画のプログラムを入れる必要があり、かなり大変だということがわかりました。
しょうがないので、その画面については別プログラムにして、SDIで作成しようかと考えていま
が、もうしばらく(1/18迄)未解決としておきますのでなにかいいアイデアありましたら書き込
んでいただけたら非常にありがたいです。
よろしくお願い致します。

たいちう 2006/01/16(月) 13:20:45
ダイアログのOnSize()で、各コントロールに対し適切な位置を計算して、
GetDlgItem()->MoveWindow()すれば良いのでないの。

『各コントロールに対し適切な位置を計算』の部分は、
どのような実装(CViewとかCFormViewとか)だとしても必要になります。

PATIO 2006/01/16(月) 16:11:59
JAVAのパネルに相当するような物はMFCには無いので
コントロールを貼り付けておけば、勝手に再配置してくれるような事はないです。
たいちうさんが言われている通り、ダイアログ上であろうが、CFormViewであろうが
自分でコントロールしてサイズに合わせた再配置を行うしか方法は無いと思います。

ですから、今のプロジェクトにダイアログを追加してコントロールの再配置のコードまで
書くのが正解なんでしょう。(多分)
面倒なコードを書かねばならないのは分かりきっているので通常これをやる人は
あんまりいないようですね。
リサイズしなくても大丈夫なようにダイアログを小さくしておくと言うのが一般的では
ないでしょうか。タブコントロールを使ってページ切り替えが出来るようにすれば、
小さなダイアログでも何とかなる場合もありますから。

たいちう 2006/01/16(月) 18:06:08
動かすだけならそんなに面倒でもないですよ。
以下はキャンセルを左下に固定する例。

void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

    enum { D = 10,  // ボタンの左と下の余白 
           W = 100, // ボタンの幅
           H = 30}; // ボタンの高さ

    CWnd *wnd = GetDlgItem(IDCANCEL);
    if (wnd) wnd->MoveWindow(D, cy - D - H, W, H);
}

ところで、ダイアログベースのデフォルトに、この変更だけ加えると、
ダイアログのサイズを変えるまでは、キャンセルボタンが右上のままです。
最初に表示されたときから左下にするために、OnInitDialogで

CRect r;
GetWindowRect(r);
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOZORDER);
SetWindowPos(NULL, 0, 0, r.Width(), r.Height(), SWP_NOMOVE | SWP_NOZORDER);

こんなことをしたのですが、もっとスマートに書けるでしょうか?
もしよければ、どなたか教えてください。

RAPT 2006/01/17(火) 00:03:11
# MFCじゃなくてゴメンナサイ
# WTL::CDialogResize ってクラス使うとMAP書くだけで良きに計らってくれます。
# 参考に・・・なるかな?

PATIO 2006/01/17(火) 13:22:55
>たいちうさん
コントロールが大量になると面倒になると言うつもりでした。
しかも画面の大きさに合わせて見やすいように再配置するとなると
かなり面倒になりそうです。
相対位置固定にしてコントロールのサイズと間隔で調整するにしても
それなりにロジックを組まないとだめですし。
質問者はどうもJAVAのパネルをイメージしているように感じたので
あそこまで自動では無理ですというつもりでした。
ところでダイアログベースの時って最初にOnSizeが来ないんですか?
来る物とばかり思ってましたが。

>RAPTさん
WTLには便利な機能があるんですね。
WTLもちょっと齧っただけで放置してたなぁ。
勉強になりました。

Blue 2006/01/17(火) 13:36:21
> 質問者はどうもJAVAのパネルをイメージしているように
いっそのこと、Formアプリケーション(MC++)にしちゃえば、
AnchorプロパティやDockプロパティが使えると思うのですけどね。

参考:
VB コントロールの配置 〜 Dock, Anchor, Splitterなど
http://www.google.com/search?num=50&hl=ja&q=Anchor+Dock&lr=lang_ja


まぁ、それだけのために MFCプロジェクトを CLRプロジェクト に変更するのはどうかと
思うけど。

ITO 2006/01/17(火) 18:55:59
 CDialogクラスでサイズを変更する必要性ってあるんですか。
見栄えは悪くなりますが、表示サイズが実際のサイズより小さくなると、
自動的にスクロールバーが表示されて隠れているコントロールも操作可能
になるのではないんですか。
 僕は、事前にサイズと配置を客先と決めます。
そして、実際のサイズが決めたサイズより小さいとき場合はスクロールバーで動かして
もらいます。

H.N@ch 2006/01/18(水) 15:12:45
[[解決]]
たいちうさん、PATIOさん、RAPTさん、Blueさんありがとうございました。

>ITOさん
CDialogのクラスでは、自動的にスクロールバーは表示されません。自分で再描画するしかないようで
す。CDialogに貼り付けることが出来るリストビューのクラスでは自動でやってくれるんですけどね。


いろいろ試してみましたが、やはり、別プロジェクトのSDIまたは、MDIでフォームビューベースで作成する
ことにしました。これが一番楽みたいです。
片方のプロジェクトからもう一方のプロジェクトを制御するのはそれほど難しくないようですので。
とういうことで、この案件は解決とさせていただきたく思います。

SDIまたは、MDIでフォームビューベースでプロジェクトを作成すると画面サイズ変更時に自動でスクロールバーを
表示し、再描画もしてくれるようです。実際にそうなっているんで間違いないと思います。
今までご意見をいただいた方々に参考になればと思い、追記させていただきました。

ほんといろいろご意見ありがとうございました。非常に参考になりました。
それではまた問題があったら書き込みさせていただきますので、その時はご協力お願い致しま
す。

ITO 2006/01/18(水) 15:27:24
> CDialogのクラスでは、自動的にスクロールバーは表示されません。自分で再描画する
> しかないようです。
> CDialogに貼り付けることが出来るリストビューのクラスでは自動でやってくれるんで
> すけど

CFormViewと一緒に考えてました。
すみませんです。

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