Visualization Tool Kit(VTK)など

一般にCSplitterWndに静的にViewを追加するためには RUNTIME_CLASS( classname ) ができなければならない.すなわち,DECLARE_DYNCREATEとIMPLEMENT_DYNCREATEを定義しなければならない.
普通はCFormViewを使うことで可能であるが,すでにCDialogの派生として実装したクラスがある場合,CFormViewで実装しなおすのは徒労である.
そこで既存のCDialog派生クラスを用いる方法として,CFrameWndを間にいれればよい.ただしリソースエディタでウィンドウスタイルの変更は必要.

以下,断片的なコード

class CLeftFrame : public CFrameWnd;

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
  m_wndSplitter.CreateStatic(this, 1, 2);
  m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS ( CLeftFrame ) );
  m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS ( CRightFrame ) );
}

int CLeftFrm::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

  m_pDlg = new CMyDlg;
  m_pDlg->Create(CMyDlg::IDD, this);
  m_pDlg->ShowWindow(SW_SHOW);

  return 0;
}

//CLeftFrmいっぱいに表示
void CLeftFrm::OnSize(UINT nType, int cx, int cy)
{
  CFrameWnd::OnSize(nType, cx, cy);

  if( m_pDlg != NULL)
  {
    CRect dlgRect, frmRect;
    m_pDlg->GetClientRect( dlgRect );
    this->GetClientRect( frmRect );

    //大きいほうにあわせる
    int width = dlgRect.Width() > frmRect.Width() ? dlgRect.Width() : frmRect.Width();
    int height = dlgRect.Height() > frmRect.Height() ? dlgRect.Height() : frmRect.Height();
    m_pMenuDlg->MoveWindow(0, 0, width, height);
  }
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

#include<memory> #include<string> #include<sstream> #include<algorithm> #include<functional> #include<numeric>

Media Foundation

【メニュー編集】
Wiki記法ガイド

メンバーのみ編集できます