Last Updated 2007/12/13
Programming Tips Visual C++ MFC CTreeView(CTreeCtrl)  索 引 
CTreeViewから他のViewへの通知
2002/12/05

エクスプローラータイプのアプリケーションにて CTreeView の動作を他の View に通知する方法.また,View の動作を CTreeView に通知する方法.

CTreeView で
  TVN_SELCHANGED    CTreeView の選択が変更された時
  TVN_ITEMEXPANDED  CTreeView のアイテムが開閉された時
を取得して通知したい View にメッセージ送信する方法がある.

  TVN_SELCHANGED
    switch( pNMTreeView->action ) {
    case TVC_BYKEYBOARD: // キーボード操作
        break;
    case TVC_BYMOUSE:    // マウス操作
        break;
    }


  TVN_ITEMEXPANDED
    switch( pNMTreeView->action ) {
    case TVE_EXPAND:    // 拡張時
        break;
    case TVE_COLLAPSE:  // 折りたたみ時
        break;
    }

MFCでのプログラミングであれば ClassWizard にてハンドラを定義可能である.

また,通知する View のハンドル(メッセージ送信時にはウィンドウハンドルが必要となる)はアプリケーションクラスにでも保管しておくとよい.

CMyApp* pApp = (CMyApp*)AfxGetApp();
pApp->m_pWndRight = m_wndSplitter.GetPane(0, 1);      // 右側のウィンドウ

上記のコードの挿入場所は,
SDI なら CMainFrame::OnCreateClient()
MDI なら 子ウィンドウの OnSetFocus()
が適切な場所だと思われる.


また,左右の View が一つの Document に対応付けられているなら,MFC の機能をそのまま使用できる.

const LPARAM HINT_EVENT = 100;

// イベント通知
void LeftView::OnEvent() {
    GetDocument()->UpdateAllViews(this,HINT_EVENT);
}

void RigitView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) {
    if ( lHint == HINT_EVENT ) {
    // イベント通知取得
    }
}


参照
アクティブなビューの取得
前後のTips
CTreeViewから他のViewへの通知

DSS ProgrammingTipsCGI Ver2.02