SDIにおけるView切り替えについて

[戻る]
タクヒサ 2004/01/22(木) 18:42:32
VC++暦1ヶ月、過去ログにはいつもお世話になっています。
今回初めて質問させていただきます。

「モーダルダイアログは使用せずに画面を切り替える」要件のコーディング中で、
「SDIにて複数Viewを切り替えて使う」ことで上記実現しようとしております。

MSDNサンプルの"collect"、"Vswap32"ならびにwebサイトを参照して
下記2つの方法があると認識しています;

A…最初に必要ViewをすべてCreateしておき、
  必要に応じて(ShowWindow関数を使い)Viewを切り替える
B…View切り替えの都度、CreateView関数でViewを作成し、
  古いViewはDestroyWindow関数で破棄する

質問は実は複数あります。
一部回答でもかまいませんのでレスポンスをよろしくお願いいたします;
Q1:上2つの方法、どちらが一般的なのでしょうか(あるいは別の方法がありますか?)。
  「こっちのやり方で似たようなプログラム書いたよ」という方がいらっしゃい
  ましたらご意見ください。  
Q2:Viewを切り替える自作(というかサンプルまねっこ)関数を
  どこに実装するのがよいかわかりません。
  app? doc? mainframe? 
  それぞれのメリット、理由付けをご教示いただけませんでしょうか。
  現在はappに記述しようとしているのですが、それは"Vswap32"がそうであるから
  という消極的理由です。
Q3:CWnd::Create と CFrameWnd::CreateView 関数が使い分けられている理由が
  よくわかりません。Createは「Windowsの子ウィンドウを作成する(MSDNより)」…?
  CreateViewは「フレーム内にビューを作成する(同上)」…?
  言葉をご教示いただけるか、参考になるのwebサイトをご紹介いただけると
  大変ありがたいです。

上、質問-回答のやり取り以前におかしい記述があればご指摘ください。
また、長文化を避けるためsourceは載せておりませんが、
ご回答に必要でしたらご連絡ください。
any help would be greatly appreciatedです。
どうぞよろしくお願いいたします。

wood 2004/01/22(木) 20:56:32
一般的かどうかは統計情報を見ていないし、私の身近な周りにC/C++開発従事者
がいないのでわかりません
つまり、書籍+WEBによる独学者の私です

ここの掲示板で「SDIにて複数Viewを切り替えて使う」のような質問に対してほとんどの
場合「Vswap32」をお勧めしています
逆を言えば、ほかの技術は知りません

MFCを使うのにMFCサンプルが適当と思われるからです

Bの考えの場合10個のVIEWがあり頻繁に切り替えが行われる場合そのたびに
VIEWの初期化が実行されると思われ,あまりメリットに思えなかったので採用
しませんでした
3つ目のVIEWの情報を保持したまま7つ目で利用したい場合3つめの情報が破棄さ
れていると利用できませんよね
また3つ目に戻った時、切り替わり前の状態を見たいなどありませんか?
初期化(create)→表示内容編集→表示 より
表示内容復元→表示の方がいいと思いましたので
CMainFrame 変更し?
Doc     変更し? 
App      SwitchView  SaveActiveViewsData
View      SetFromDoc  SetToDoc
           ((App*)AfxGetApp())->SwitchView( 切り替えたいviewの番号 );

iijima 2004/01/22(木) 21:33:58
A1
私は,Collectサンプルの方法を使ったことがあります.
経験があるというだけで,どちらが一般的かどうかは知りません.

A2
これもあくまでも私が作成したプログラムの事例にすぎませんが,
メインメニューにビュー切り替えのメニューアイテムを追加し,
そのメニューが選択されたときのコマンドハンドラをCMainFrameクラスに追加し,
そのハンドラの中でビューの切り替えの処理を書きました.

A3
前述の事例を作成したときに調べたことですが,CFrameWnd::CreateView関数は,
引数に渡されたCCreateContextオブジェクトに格納されている情報に基づき,

1.ビュークラスのインスタンスを生成し,
2.そのインスタンスに基づき,フレームウィンドウの子ウィンドウとしてビューの
 Windowsのウィンドウを作成し(ここで,そのビュークラスのCreate関数が呼ばれ
る),
3.ドキュメントオブジェクト内のビューリストにそのビューを登録する
(CCreateContextオブジェクトのm_pCurrentDocメンバーに,有効なドキュメントのポイ
 ンタが設定されていればです).

という一連の処理をします.
CWnd::Create関数は,既に生成されたCWnd(又はその派生クラス)のインスタンスに基
づき,Windowsのウィンドウを作成するという処理を行います.

# 大分前に調べたことなので,記憶違いがあるかも知れません.
# 誤りがありましたら,ご指摘ください.

渋木宏明(ひどり) [HomePage] 2004/01/22(木) 23:08:15
>MSDNサンプルの"collect"、"Vswap32"ならびにwebサイトを参照して
>下記2つの方法があると認識しています;

変化技っぽいですが、CHtmlView ベースで作って、View を HTML で記述するとか。

タクヒサ 2004/01/23(金) 10:14:55
みなさん、お忙しい中ご意見ありがとうございます。

woodさん、
>App      SaveActiveViewsData
>View      SetFromDoc  SetToDoc
上記考え方は思いつかなかったです。ご参考にさせていただきます。

iijimaさん、
CFrameWnd::CreateView と CWnd::Create のご解説ありがとうございます。
iijimaさんの説明と、デバッグでの「ステップイン」にて
理解を深めようと努めております(むずかしい…)。

渋木宏明(ひどり)さん、
HTML! WebApplicationを作る感じになるんでしょうか(HyperLink?)。
今回はアドバイスをありがたくいただいて実現はいつの日か…
thanks anywayでございます。

ご意見募集というQ1、Q2の性質上、
解決チェックはせずにもう少しopenにしておこうと思います。

引き続きよろしくお願いいたします。

dairygoods 2004/01/23(金) 11:23:52
A1. 
  毎回作ると、
  ・メモリを消費しない
  ・起動が早い
  ・切り替えるたびに時間が掛かる
  ・前回の状態を維持したい場合面倒
  ・前回の状態を毎回クリアしたい場合簡単
  ・作ったり削除したりという操作により、
    メモリ/リソースリークの影響が蓄積される。
  ・同じビューを複数表示するといった応用が利く

  最初にまとめて作ると、毎回作る場合の逆になります。

 現在のアプリケーションで、
  何を優先するかを考えて決めればよいでしょう。


A2. MDIでビューを切り替えたり並べたりという処理は、
 CMDIFramwWndがやっていますね。

タクヒサ 2004/01/23(金) 18:24:10
dairygoodsさん、
アドバイスありがとうございます。
毎回作るやり方では新しいView追加の要件に対応しやすそうにも思います
(最初に作る方法ではViewの枚数が多いとViewとNUMVIEWSの関連付けが煩雑そうです)。

もうしばらくopenにさせていただきます。

タクヒサ 2004/01/30(金) 10:10:51
[[解決]]
解決とさせていただきます。
ご回答いただきました
woodさん、iijimaさん、渋木宏明(ひどり)さん、dairygoodsさん、
ありがとうございました。

私もいつか回答できるようになるべく精進いたします。

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