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

ダイアログベースで作成したプロジェクト...
 
通知
すべてクリア

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

固定ページ 1 / 2

H.N@ch
 H.N@ch
(@H.N@ch)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

初めめて投稿します。
開発環境はOS:WIN2000 コンパイラ:VC++.NETです。

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


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

SDI/FormViewベースで作り直すのが結局近道なんじゃないかと。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> やっているうちに、ダイアログベースでプロジェクトを作成するとCFormViewクラスは
> 呼べないのかなとも思い始めました。

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


返信引用
H.N@ch
 H.N@ch
(@H.N@ch)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

επιστημη さん、Ban さん早速の回答ありがとうございます。

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

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

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> 新しい画面だけサイズ変更が出来ればいいというものです。

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

ですね。大きさ可変のダイアログにするだけ。
# ホントにそれだけが目的ならば。


返信引用
H.N@ch
 H.N@ch
(@H.N@ch)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

ダイアログのOnSize()で、各コントロールに対し適切な位置を計算して、
GetDlgItem()->MoveWindow()すれば良いのでないの。

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

動かすだけならそんなに面倒でもないですよ。
以下はキャンセルを左下に固定する例。

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
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

# MFCじゃなくてゴメンナサイ
# WTL::CDialogResize ってクラス使うとMAP書くだけで良きに計らってくれます。
# 参考に・・・なるかな?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 質問者はどうも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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
H.N@ch
 H.N@ch
(@H.N@ch)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

たいちうさん、PATIOさん、RAPTさん、Blueさんありがとうございました。

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

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

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

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


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました