MFC vc++ 中CTreeContrl如何自定義實現滑鼠單擊或雙擊響應事件 ,即重寫類似於控制元件的響應事件或訊息
阿新 • • 發佈:2019-01-06
目的:自定義修改mfc視窗的FileView中已有的樹結構,而不是新增的樹控制元件
實現的效果如圖:點選“地圖”後彈出框提示,點選響應效果與控制元件的響應事件類似
首先需要重寫CtreeContrl:
① 在CViewTree類的.h標頭檔案中新增程式碼:
afx_msg void OnDblClkTree(NMHDR* pNMHDR, LRESULT* pResult);//雙擊事件
afx_msg void OnClkTree(NMHDR* pNMHDR, LRESULT* pResult);//單擊事件
② 新增後的.h檔案如下:
#pragma once ///////////////////////////////////////////////////////////////////////////// // CViewTree 視窗 class CViewTree : public CTreeCtrl { // 構造 public: CViewTree(); // 重寫 protected: virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult); // 實現 public: virtual ~CViewTree(); afx_msg void OnDblClkTree(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnClkTree(NMHDR* pNMHDR, LRESULT* pResult); protected: DECLARE_MESSAGE_MAP() };
③ CViewTree類的cpp原始檔中實現該事件,程式碼如下:
#include "stdafx.h" #include "ViewTree.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CViewTree CViewTree::CViewTree() { } CViewTree::~CViewTree() { } BEGIN_MESSAGE_MAP(CViewTree, CTreeCtrl) ON_NOTIFY_REFLECT(NM_DBLCLK, &CViewTree::OnDblClkTree) ON_NOTIFY_REFLECT(NM_CLICK, &CViewTree::OnClkTree) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CViewTree 訊息處理程式 BOOL CViewTree::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { BOOL bRes = CTreeCtrl::OnNotify(wParam, lParam, pResult); NMHDR* pNMHDR = (NMHDR*)lParam; ASSERT(pNMHDR != NULL); if (pNMHDR && pNMHDR->code == TTN_SHOW && GetToolTips() != NULL) { GetToolTips()->SetWindowPos(&wndTop, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE); } return bRes; } void CViewTree::OnDblClkTree(NMHDR* pNMHDR, LRESULT* pResult) { HTREEITEM hTreeItem = GetSelectedItem(); //以GetItemText()函式為例: CString S1 = GetItemText(hTreeItem); AfxMessageBox("You have selected "+S1); *pResult = 0; } void CViewTree::OnClkTree(NMHDR* pNMHDR, LRESULT* pResult) { HTREEITEM hTreeItem = GetSelectedItem(); //以GetItemText()函式為例: CString S1 = GetItemText(hTreeItem); AfxMessageBox("You have selected "+S1); *pResult = 0; }
注意:新增的位置要正確。
以上即可實現CtreeContrl的點選事件