Visualization Tool Kit(VTK)など

※本稿におけるTree ViewはCTreeViewではなくコモンコントロールのTree Viewである.MFCではCTreeCtrlである.

CTreeCtrlはWindows APIのTree-view (http://msdn.microsoft.com/en-us/library/windows/de... の薄いラッパーである.
MFCのソースを見ると,すべての関数はインラインでTree ViewにSendMessageしているだけである.
そのため機能はTree Viewに限定される.

デフォルトの動作

  • 左ダブルクリックでCollapse/Expand切り替え
  • TVS_CHECKBOXESでチェックボックスをつけられるがその通知はない

サブクラス化によるデフォルト動作の変更

ダイアログでCTreeCtrl上の左クリックは通知されない(ON_LBUTTON_DOWN).
WindowsAPIの中で規定の動作で処理されてしまうからである.(Expand/Collapseやチェック)
このイベントをディスパッチするために,メッセージリフレクションを用いる.
どのようなメッセージがあるかはMSDNのTree Viewのリファレンスを見ればよい.

例: チェックボックスの変化を検出

#define TVN_CHKCHANGE 1

ON_NOTIFICATION_REFLECT(NM_CLICK, &CTreeCtrlSub::OnNMClk)
void CTreeCtrlSub::OnNMClk(NMHDR *pNMHDR, LRESULT *pResult)
{
    NMTREEVIEW *pNMTree = (NMTREEVIEW*)pNMHDR;
    TVHITTESTINFO ht = {0};
    DWORD pos = ::GetMessagePos();

    ht.pt.x = LOWORD(pos);
    ht.pt.y = HIWORD(pos);
    ::MapWindowPoints(HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1);
    HitTest(&ht); //なお,このHitTestもMFCではなくWindows内部で処理される(SendMessageしてるだけ)

    // HitTestの結果,チェックボックス上(STATEICON)であればチェック状態を変更
    if (TVHT_ONITEMSTATEICON & ht.flags)
    {
      this->SetCheck(ht.hItem, !GetCheck(ht.hItem));
    }

    if (ht.hItem)
    {
      // 当該項目を選択状態にし,親ウィンドウにメッセージを投げる
      this->SelectItem(ht.hItem);
      DWORD H = DWORD(TVN_CHKCHANGE) << 16;
      DWORD L = DWORD( this->GetDlgCtrlID() );
      WPARAM wParam = H + L;
      this->GetParent()->PostMessage(WM_COMMAND, wParam, (LPARAM)this->GetSafeHwnd());
    }    
    // 規定の動作は行わない
    *pResult = 1;  
}

コメントをかく


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

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

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

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

Media Foundation

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

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