分割ウィンドウ:ペイン内のVIEW動的変更

[戻る]
PON 2006/10/17(火) 14:47:45
いつも拝見しております。
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は、当然ペインサイズが同じですが、
ボタンの表示が違うものです。


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

てんてく 2006/10/17(火) 17:13:33
m_wndSplitter.DeleteView(0, 0);
m_wndSplitter.CreateView(0, 0, (CFView_XX1のランタイムクラス), (size), 
pContext) ;
m_wndSplitter.RecalcLayout();

InitialUpdateFrame( NULL , TRUE );

でいけると思われます

PON 2006/10/18(水) 13:37:23
>てんてくさん
早速のご返信ありがとうございます!
てんてくさんの内容について、さらに質問です。

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

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

PON 2006/10/19(木) 09:42:01
[[解決]]
おはようございます。

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

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