エクスプローラータイプのアプリケーションにて 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 ) {
// イベント通知取得
}
}
参照
アクティブなビューの取得