初めまして,shogoと申します.
WinXP,VC7,MFCを使用して開発をしています.
CViewから派生したクラスを動的配列で保持したいと思っています.
現在は,
CRuntimeClass *pViewClass = RUNTIME_CLASS(CXXXView);
//CXXXViewはCViewから派生したクラス
CXXXView* test = (CXXXView*)pViewClass->CreateObject();
CCreateContext context;
context.m_pCurrentDoc = GetDocument();
test->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, CRect(0,0,100,100), this,
5000, &context);
XXXView.Add(test); //CObArray XXXView;(ヘッダに記述)
と,CObArrayでCViewから派生したクラスを保持しています.
質問としては,CViewから派生したクラスを動的配列で,
本当にこのように保持していいのか?
何か他に,正しい保持方法があるのか?
という2つです.
よろしくお願いいたします.
普通、 CMultiDocTemplate で管理するのでは?
Wizard のスケルトンからして、こういうコードを吐きますし。
というか、CDocument と関連しない CView だけ
複数作っても意味がないと思いますが、どのような用途ですか?
単にCWnd なら何でもよいということですか?
失礼、GetDocument は直接されてますね。
CDocumentとは,特に関連している必要はないものを作っています.
(CDocumentは,なくても問題なし,と自分では思っている)
用途としましては,何かイベントが起こったら,Viewを切り替えるということで,
例えば,メニュー1を選んだら,View1が表示され,
メニュー2を選んだら,View2に切り替わる,といったことです.
よろしくお願いします.
CView だと、やっぱり CMultiDocTemplate の方が
普通なんじゃないでしょうか。
イメージからすると、常に最大化した子窓を持つMDI で、
イベントがきたらアクティブな子のフォーカスを移動、
でもいい気がしますし。
# 多分、コレクションに入れても動くとは思いますけど。
shogoです.
> CView だと、やっぱり CMultiDocTemplate の方が普通なんじゃないでしょうか。
ご意見,ありがとうございます.
SDIより,MDIの方がよいと理解して,よろしいでしょうか?
(しかしながら,個人的にSDIで作りたいという思いがあります….)
私が MFC を使ってそういう動作を実現するなら多分、
最大表示に子窓を固定した MDI にします。
View を切り替えて動作する以上は MultiView で、
MDI は MultiView-MultiDocument Interface で
あるという認識があるからです。
# SDI は、SingleView-SingleDocument の場合に
# 特化して簡略化したものだと思ってます。
これ自体は多分捉え蚊方の問題なので、
CView であることが前提でなく単に CWnd でも構わないという
shogo さんの認識であれば SDI でもいいと思いますが、
CView を使おうと思われている時点で、潜在的に MDI の方が
美しい 構成なのかな、とは感じました。
私の想像する限り、CView の設計者が想定している複数管理の
方法は CMultiDocTemplate だと思いますので、
「何か他に,正しい保持方法があるのか?」と聞かれたら、
それが唯一正しいのかは別にして、一般的には
CMultiDocTemplate ではないかと思います。
> SDIより,MDIの方がよいと理解して,よろしいでしょうか?
> # SDI は、SingleView-SingleDocument の場合に
> # 特化して簡略化したものだと思ってます。
私は複数のドキュメントがないならSDIが良いと思います。
CFrameWnd::SetActiveView というのも使えるわけだし。
# 好みの問題なのかも。それと私にMDIの経験が少ないせいかも。
それよりCViewを動的配列でっていうのが気になります。
1組のデータ(ドキュメント)に対して、
表形式で表示、グラフで表示、と切り替えたい様な場合に、
複数のビューを作るのが普通の使い方だと思います。
動的配列ということですが、それぞれのビューは互いにどれだけ
違うのでしょうか。ドキュメントが空っぽなのは構いませんが、
1つのビューで全てを(もちろん同時にではなく)表示すること
は不可能なのでしょうか?
> # 好みの問題なのかも。それと私にMDIの経験が少ないせいかも。
shogo さんの正確な構成や要件が分からない以上は、
当然お互い好みの影響をかなり受けていると思います。
# ちなみに私は MDI の方が多いクチですし。
> # 1つのビューで全てを(もちろん同時にではなく)表示すること
> # は不可能なのでしょうか?
少なくとも一つのビュー内を差し替えると面倒な程には違うと
想定してましたけど。
前提としてこれが簡単なら悩むことも無く素直な SDI だと私も思いますし。
shogoです.
Banさん,お返事ありがとうございます.
> 一般的にはCMultiDocTemplate ではないかと思います。
そうですか.
MDIは,今まで全く触ったことがなかったので避けようと思っていました.
しかし,こちらのほうが一般的のようですね.
少し,勉強して,使用することも考慮していこうと思います.
たいちうさん,お返事ありがとうございます.
> それぞれのビューは互いにどれだけ違うのでしょうか。
> ドキュメントが空っぽなのは構いませんが、1つのビューで全てを(もちろん同時に
ではなく)表示することは不可能なのでしょうか?
実際のところ,ビューの構成は,ほとんど同じです.
1つのビューで全てを表示というのが,ちょっと曖昧でわかりにくいですが,
現段階では,やってやれないことはありません.
(今後,機能追加をすると,おそらく不可能になると思います.)
完成のイメージを簡略化して説明すると,画像のサムネイルが並んでいて,
それをクリックしたら,その画像を大きいものが表示,といった感じです.
配列で保持しておくと,後々の処理が楽になるという見通しがあるため,
配列(ビューの個数が可変なので動的配列がよい)に,
持っておきたいと思っています.
(ドキュメントは,基本的に使いません.今後,もしかしたら使うかも.)
画面いっぱいのサムネイル表示が完全に消えて、
画面いっぱいの拡大画像と切り替わって表示、
ということでしょうか。
それならサムネイル用と拡大表示用にビューは(固定で)
2枚あれば十分な気がしますが。
中のデータだけキャッシングするなり、コレクションに
入れるなりしてあればよいのでは?
そして、このコレクションに格納されたデータの管理を
Document が統括して行う、という方が MVC 等の
考慮して綺麗な設計になる気が個人的にはしますが
どうでしょう。
あ、この場合には無理に MDI にすることもないと
思います。
shogoです.
多少,説明不足でした.
> 画面いっぱいのサムネイル表示が完全に消えて、
> 画面いっぱいの拡大画像と切り替わって表示、
ではなく,IE風に左右に分割されたViewがあり,
(左がサムネイル,右が画像表示ビュー)
サムネイルをクリックすると,ビューが変わる,というものです.
(画像ソースの数が可変.右ビューは厳密には画像のみではないです.)
すいません,よろしくお願いいたします.
なるほど。
だとすると、私ならやっぱりビューの数は固定ですね。
例えば右画面に拡大ビューとプロパティビューが選べるなら、
それをそれぞれ一つ作っておくだけです。
「ビューの数=提供する表示や操作のインターフェイスの数」
だと思いますから。
実際にサムネイルから選択するのはただのデータですし、
データの数だけ View を作ったりはしないと思います。
View の中で必要なデータを GetDocument 経由で取得して
表示してあげれば良いのではないでしょうか。
shogoです.
Banさん,レスありがとうございます.
> 必要なデータを GetDocument 経由で取得して表示
やはり,そうですか.
現状は,これでいくことにします.
最初に質問したことですが,
「CObArrayでCViewから派生したクラスを保持」
これは,やってもいいことなのか,やってはだめなことなのか,どちらでしょうか?
(エラーは出てないから,いいと思ってはいますが….)
よろしくお願いいたします.