分割ウィンドウ:ペイン内のVIEW動的変更 – プログラミング – Home

分割ウィンドウ:ペイン内のVIEW動的...
 
通知
すべてクリア

[解決済] 分割ウィンドウ:ペイン内のVIEW動的変更


PON
 PON
(@PON)
ゲスト
結合: 18年前
投稿: 21
Topic starter  

いつも拝見しております。
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は、当然ペインサイズが同じですが、
ボタンの表示が違うものです。

どなたか、よろしくお願いします。


引用未解決
トピックタグ
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
 

m_wndSplitter.DeleteView(0, 0);
m_wndSplitter.CreateView(0, 0, (CFView_XX1のランタイムクラス), (size),
pContext) ;
m_wndSplitter.RecalcLayout();

InitialUpdateFrame( NULL , TRUE );

でいけると思われます


返信引用
PON
 PON
(@PON)
ゲスト
結合: 18年前
投稿: 21
Topic starter  

>てんてくさん
早速のご返信ありがとうございます!
てんてくさんの内容について、さらに質問です。

>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 );

}


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
 

これは画面を切り替えたい任意のメッセージを受けたときに
実行する部分です。
自分の提示したやり方があっているとは言い切れませんが
今のところ問題が起こったことはないです。


返信引用
PON
 PON
(@PON)
ゲスト
結合: 18年前
投稿: 21
Topic starter  

おはようございます。

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 );
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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