いつも拝見しております。
VC++初心者のPONと申します。
過去LOGを見たのですが、近いものが無かったので、
ご質問させていただきたく。。
環境:Visual Studio 2005 VC++
構成:SDI 分割有り(左右)
------------+-------|
| Aペイン | B |
| | ペイン|
| | |
------------+-------|
Aペイン:データ表示 (CVIEW: ExView.h, ExView.cpp):固定
Bペイン:ボタン操作(CFormView: FView1.h, FView1.cpp)
(CFormView: FView2.h, FView2.cpp)
初期状態では、MainframeのOnCreateClientで
m_wndSplitter.CreateView (
0 //スプリッタの行番号を指定
, 1 //スプリッタの列番号を指定
, RUNTIME_CLASS(CFView1) //指定ペインを管理するViewクラス
, CSize(200,50) //ペインのサイズ
, pContext );
つまり、BペインにはCFView1の内容が表示されています。
これを、MainMenuの制御でBペインの中身をFView1⇔FView2という風に
変更可能にしたいと思っています。
MainMenuから切り替え命令のメッセージを飛ばすのはわかるのですが、
実際にFormViewを切り替えるやり方がよくわかりません。。。
なお、CFView1とCFView2は、当然ペインサイズが同じですが、
ボタンの表示が違うものです。
どなたか、よろしくお願いします。
m_wndSplitter.DeleteView(0, 0);
m_wndSplitter.CreateView(0, 0, (CFView_XX1のランタイムクラス), (size),
pContext) ;
m_wndSplitter.RecalcLayout();
InitialUpdateFrame( NULL , TRUE );
でいけると思われます
>てんてくさん
早速のご返信ありがとうございます!
てんてくさんの内容について、さらに質問です。
>m_wndSplitter.DeleteView(0, 0);
>m_wndSplitter.CreateView(0, 0, (CFView_XX1のランタイムクラス), (size),
>pContext) ;
>m_wndSplitter.RecalcLayout();
上記ですが、これはOnCreateClientに書くと思われます。
しかし、OnCreateClientに上記を書いて
InitialUpdateFrame
を実行しても、立ち上げ時1回きりで、その後は走らせることはできないようです。
何かやり方が間違っているのでしょうか??
--------------- 下記、簡単なソースコード ---------
<mainframe.cpp: 分割ウィンドウのVIEW設定>
BOOL CMainFrame::OnCreateClient(
LPCREATESTRUCT lpcs,
CCreateContext* pContext)
{
1. この中で、初期化、分割ウィンドウのCreate、View設定をしています。
2. 初期化後に下のコマンド:OnCommandUpdateがコールされると
この中でViewの切り替え(DeleteView/CreateView)を行います
return TRUE;
}
<mainframe.cpp :メッセージハンドラ>
void CMainFrame::OnCommandUpdate()
{
// TODO: ここにコマンド ハンドラ コードを追加します。
InitialUpdateFrame( NULL , TRUE );
}
これは画面を切り替えたい任意のメッセージを受けたときに
実行する部分です。
自分の提示したやり方があっているとは言い切れませんが
今のところ問題が起こったことはないです。
おはようございます。
CreateView を使うためには、引数最後のコンテキスト情報(CCreateContext)が
必要なわけですが、CCreateContextの情報は、OnCreateClientだけでしか
取得できないと思ってました。
以下のコードで取得できました。
//コンテキスト情報取得
CCreateContext context;
context.m_pCurrentDoc = GetActiveDocument();
これにより、メッセージハンドラ内で、CCreateContextの情報を取得し、
CreateView()を利用でき、ビューの更新ができるようになりました。
>てんてくさん
お手数おかけしてすいません。
どうもありがとうございました。m(_ _)m
※修正したコードの一部を記します。
void CMainFrame::OnCommandUpdate()
{
//コンテキスト情報取得
CCreateContext context;
context.m_pCurrentDoc = GetActiveDocument();
// ペインのビュー削除
m_SplitWnd.DeleteView ( 0 , 0 );
// ペインのビュー更新
m_SplitWnd.CreateView ( 0 , 0 , RUNTIME_CLASS( ... )
, CSize( 200 , 0 ) , &context );
m_SplitWnd.RecalcLayout();
InitialUpdateFrame( NULL , TRUE );
}