フレームからVIEWへ再描画を命令したい – 固定ページ 3 – プログラミング – Home

フレームからVIEWへ再描画を命令した...
 
通知
すべてクリア

[解決済] フレームからVIEWへ再描画を命令したい

固定ページ 3 / 5

maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> 何か勘違いしてますか?
UpdateAllViews()はドキュメントを更新した後の反映を、そのドキュメントに関連した
全てのViewに行わせるものです。今回の場合、ダイアログバーで設定した内容をドキュ
メントに保存するのであれば正しい考え方ですが、今回はドキュメントとは無関係に
Viewを更新する手段の話をしています。UpdateAllViews()が目的にあった関数であると
いうのは正しくないでしょう。

UpdateAllViews()で全てのViewを更新するのが最も簡単な方法であることもわかって
いますが、その副作用についても考察してください、ということです。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

おっしゃりたいことは分かりました。

私が考える、そもそもの問題の始まりは以下のようなものです。
Doc-Viewの考え方では、本来、ビューの表示に関するものは全て、ビューで持つ
というのが根本にある考え方です。
その考えに沿うなら、ダイアログバーはビューのメンバであるべきです。
そうであるなら、自分の表示倍率は自分で持つ(ビューのメンバ)ことになり、全
てがまるく収まるのです。

ところが、今回の例では、ダイアログバーはビューのメンバではなく、メイン
フレームのメンバです。
そのため、混乱が生じていると考えます。

では、どうするか?
その回避方法に関して、意見が割れているのだと思います。

> UpdateAllViews()はドキュメントを更新した後の反映を、そのドキュメントに関連
> した全てのViewに行わせるものです。今回の場合、ダイアログバーで設定した内容
> をドキュメントに保存するのであれば正しい考え方ですが、今回はドキュメントと
> は無関係にViewを更新する手段の話をしています。UpdateAllViews()が目的にあっ
> た関数であるというのは正しくないでしょう。

例えば、ビューの背景色(全ビュー共通、かつ非ドキュメント保存)をメニューから
変えられるものとします。
この背景色変更の通知を、全ビューに伝えるにはどうしますか?
UpdateAllViews()
で問題ないと思いませんか?
(まじめに全ビューのポインタを辿って通知してもいいけど、せっかくある仕組みを
わざわざ使わないのも、なにかおかしな気が)
私の回避策は、この視点に立っています。

いずれにせよ、今回の件は、Doc-Viewの考え方からすれば例外的な部分だと思うの
です(Viewの表示状態を、MainFrameのメンバであるダイアログバーが行っている)。
だから、何が正しいか?という議論は無意味な気がします。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> 例えば、ビューの背景色(全ビュー共通、かつ非ドキュメント保存)をメニューから
> 変えられるものとします。
領域の違う例をだされてもねぇ。
この様な場合なら、私もUpdateAllViews()を使うことに余りためらいはないだろうけ
ど、今回は個別のビューに関する更新で、全ビュー共通の話なんかしてないじゃん。

> (まじめに全ビューのポインタを辿って通知してもいいけど、せっかくある仕組みを
> わざわざ使わないのも、なにかおかしな気が)
だから完全に否定もしていないけど、「その副作用についても考察してください」
とも言っているでしょ。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

すいません。
すでに冷静でないと思われるので、このスレからは私は去ります。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 16年前
投稿: 100
Topic starter  

bunさん、maruさん、ご意見ありがとうございます。
いろんな、ご意見があって当然だとおもいますので、お二人のお話は、とても参考にな
ります。こうやって、意見をかわしていただけるは、とてもありがたいことだと思いま
す。

 話は、かわりますが、一つのクラスに2つのVIEWを持つというのは、2つのクラ
スの派生クラスとしてもつのでしょうか?has a?is a?どちらでもかまわない?イメー
ジがちょっとわかないんですが・・・いつもは、1つの基本クラスをウィザードで選ん
でだいたいできてしまいますんで、すいません。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

その前に、
> ダブルVIEW表示って何?
に対する答えは?
それはどんなものなの。どういう実装なの。

右ビュー、左ビューっていう単語から考えるとMDIチャイルドウィンドウが左右に
分割されていて、右と左にわかれているのかな、と思っています。
そういう場合、普通はCSplitterWndクラスを使用すると思います。
CSplitterWndクラスはウィンドウを複数のペインに分割しそれぞれ別のビューを乗
せることが出来ます。ここまで言えば has a/is a は自明でしょ。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 16年前
投稿: 100
Topic starter  

maru さん、レスありがとうございます。
ご推察のとおりで、チャイルドフレームに以下のコーディングをしています。

> ChildFrm.h
CSplitterWnd m_wndSplitter;

> ChildFrm.cpp
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs,
CCreateContext* pContext)
{
if(!m_wndSplitter.CreateStatic( this,
1, 2, // TODO: 行と列の数を調整してください。
WS_CHILD | WS_VISIBLE )
) return FALSE;

if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDumpView)
                  ,CSize(256,64),pContext)) return FALSE;
if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CED2GNekketsuEView)
                  ,CSize( 96,64),pContext)) return FALSE;
}

CNekketsuApp::InitInstance()でCMultiDocTemplate()でむすびつけています。
CMultiDocTemplate()をつかうと、is a/has aでは、ありませんよね。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

CChildFrame has a CDumpView and CED2GNekketsuEView.
と思うけど違うのかな。

> >左右のビューをセットで管理しておく方がいいと思います。
> ちょっと、いろいろ試してみます。
すでにセットで管理されているじゃん。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 16年前
投稿: 100
Topic starter  

maruさん、たびたびレスありがとう、ございます。
CMultiDocTemplate()をつかうとhas aということになるんですか・・・。
すいません、わかってなくて。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

質問に質問で返すようですが、既に出来上がっているモデル(MFCフレームワーク)に
対してis a/has aを論じることに意味があるのでしょうか?

私は、何かの問題解決(プログラム作成)の為、問題を解析(モデリング)する時に
オブジェクト間の関係をis a/has aで表し、その関係をプログラムにしていくものだ
と考えています。モデリングした結果であるMFCフレームワークに対して、これはis a
だから、とかhas a だからといった議論は意味がなくて、クラス間に派生関係や包含
関係があるだけだと思います。フレームワークを使う側は、その派生関係や包含関係
を理解して使用する必要はありますが、is aであるかhas aであるかはプログラム上
関係ないのではないでしょうか。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 16年前
投稿: 100
Topic starter  

maruさん、レスありがとうございます。
最初は、maruさんのおっしゃる、2つのビュークラスの管理クラスという意味がわから
なかったので、糸口をつかむために質問してみました。
そうですね。あまり意味がないかもしれません。すみませんでした。

いま、二つのビュークラスをもつ、チャイルドフレームから、アクティブでない方のビ
ュークラスへのアクセスがわかりません。CFrameWnd::SetActiveView()かな?とマニュ
アルを読んでいたところです。(すいません、途中で、いっぱい、書いていただけるの
で、返事、かかなくっちゃ・・・とおもいまして)


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> いま、二つのビュークラスをもつ、チャイルドフレームから、アクティブでない方の

> ュークラスへのアクセスがわかりません。CFrameWnd::SetActiveView()かな?
そうでなくて、...
CFrameWndのメンバのwndSplitterが二つのビュー(CSplitterWndではPaneと呼ぶ)を
持っているんだから、CFrameWndクラスでwndSplitter.GetPane(0, 0);で左のビュー、
wndSplitter.GetPane(0, 1);で右のビューへのポインタが取得できるでしょ。
ダンプ画面に要求が来たら、その親であるチャイルドフレーム(CFrameWnd)に要求を
投げ、チャイルドフレームは絵を表示しているビューをスプリッタウィンドウから取得
して、要求を投げればいいの。簡単でしょ。

もっとも、元の要求を投げるダイアログバーがチャイルドフレームに有るんだったら、
そこから直接絵を表示しているビューがわかりそうなもんだけど。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> CChildFrame has a CDumpView and CED2GNekketsuEView.
> すでにセットで管理されているじゃん。
の意味がわかってなかったってことね。orz


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 16年前
投稿: 100
Topic starter  

> 意味がわかってなかったってことね。orz

そういうことです。

> CFrameWndのメンバのwndSplitterが二つのビュー(CSplitterWndではPaneと呼ぶ)を
> 持っているんだから、CFrameWndクラスでwndSplitter.GetPane(0, 0);で左のビュー、
> wndSplitter.GetPane(0, 1);で右のビューへのポインタが取得できるでしょ。
> ダンプ画面に要求が来たら、その親であるチャイルドフレーム(CFrameWnd)に要求を
> 投げ、チャイルドフレームは絵を表示しているビューをスプリッタウィンドウから取
> 得して、要求を投げればいいの。簡単でしょ。

読んだ瞬間、身震いが・・・モーレツに感動してます。きのうからずっと、
GetActiveView()があるんだから、アクティブされていない、GetNonActiveView()みたい
なものがあるのでは・・・と想いながら、ずっとずっと、さがしていました。実際に
は、ビューのポインタの取り方がわからなかったので、どうするんだろう・・とおもっ
ていました。これでなんとか進みそうです。ありがとうございます。


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

うーーん、
MDIですよね?
で、開くウインドウは一つで固定ですか?
「ファイルを開く」で画像ファイルを読み込むつどウインドウが増えるように
予想していたのですが違いますか?
開くウインドウは一つであるならmaruさんのご意見で間違いないです。

PS 僕が言っている一つのウインドウとは、CSplitterWndで2分割されている
 ウインドウです。


返信引用
固定ページ 3 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

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