MFC vc++ 中CTreeContrl如何自定義實現滑鼠單擊或雙擊響應事件 ,即重寫類似於控制元件的響應事件或訊息

acoolgiser發表於2018-07-30

程式碼部分摘錄自“天上的猩猩的專欄”:https://blog.csdn.net/qq_23992597/article/details/51006920#commentsedit

目的:自定義修改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的點選事件

相關文章