如何向ctreeview中的树节点添加按键响应

yyang0514 2014-09-12 03:38:44
我用了一个微软的示例,
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q148738
有几个高手热心给我指点了一些方法,但由于代码环境不一致始终没成功。
麻烦你下载一下微软的代码,然后告诉添加按键响应的方法。谢谢了!

想在上面添加一个按键响应。用了如下方法一直也没有成功:
1.添加了消息TVN_SELCHANGED后,单击tree 上的树节点没有反应。

ON_NOTIFY_REFLECT(TVN_SELCHANGED, &CLeftView::OnTvnSelchanged)
void CLeftView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
HTREEITEM ht=m_Tree.GetSelectedItem();

CString strSelect=m_Tree.GetItemText(ht);
MessageBox(strSelect);
*pResult = 0;
}

2.添加NM_CLICK消息后,点击树节点仍然没反应


ON_NOTIFY_REFLECT(NM_CLICK, &CLeftView::OnNMClick)
void CLeftView::OnLDownClick(NMHDR* pNMHDR, LRESULT* pResult)
{
switch (pNMHDR->code)
{
case NM_LDOWN:
{

MessageBox("ii");
break;
}
}
}
...全文
203 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyubuct1 2014-09-17
  • 打赏
  • 举报
回复
非常有用,收藏了。
schlafenhamster 2014-09-17
  • 打赏
  • 举报
回复
用派生类反而不不容易实现了, 是的 搜索 "OnBeginDrag"
yyang0514 2014-09-16
  • 打赏
  • 举报
回复
引用 14 楼 schlafenhamster 的回复:
微软的程序是: void CTreeCtrlView::OnBeginDrag (NMHDR* pnmhdr, LRESULT* pResult) 在CTreeCtrlView (即treectrl 的父窗口)处理
你的意思是说, 如果要实现拖动的话还是用微软的比较好。用派生类反而不不容易实现了是吗? 我实际用了派生类后再来ctreectrlview实现窗口之间的拖动,确实不能拖动了。
schlafenhamster 2014-09-16
  • 打赏
  • 举报
回复
微软的程序是: void CTreeCtrlView::OnBeginDrag (NMHDR* pnmhdr, LRESULT* pResult) 在CTreeCtrlView (即treectrl 的父窗口)处理
schlafenhamster 2014-09-16
  • 打赏
  • 举报
回复
“对tree中节点进行拖动,” 因为 要 2个 窗口 (源,和·目) 所以 在 父窗口 处理 为好 , 这也就是 为什么 微软那个程序 不用 派生 CTreeCtrl 的 原因。
yyang0514 2014-09-16
  • 打赏
  • 举报
回复
引用 11 楼 yyang0514 的回复:
[quote=引用 8 楼 schlafenhamster 的回复:] “将派生的树类已经加入到了cview类,否者编译无法通过。” 不是 “加入” !!! 是叫你 把 原来微软程序(不是 什么 CLeftView)的 class CTreeCtrlView : public CView { protected: enum {NUM_BUTTONS = 9}; CTreeCtrl m_Tree; // 改 这个 变量 的 类 名 为 MYTREE。
不好意思,犯了个地级错误。浪费你这么多时间。非常感谢。[/quote] 追问一下,如果我要对tree中节点进行拖动的操作,我是在MYTREE中做还是在CTreeCtrlView中来实现呢。
yyang0514 2014-09-16
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
“将派生的树类已经加入到了cview类,否者编译无法通过。” 不是 “加入” !!! 是叫你 把 原来微软程序(不是 什么 CLeftView)的 class CTreeCtrlView : public CView { protected: enum {NUM_BUTTONS = 9}; CTreeCtrl m_Tree; // 改 这个 变量 的 类 名 为 MYTREE。
不好意思,犯了个地级错误。浪费你这么多时间。非常感谢。
yyang0514 2014-09-16
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
#include "MyTreeCtrl.h" class CTreeCtrlView : public CView { protected: enum {NUM_BUTTONS = 9}; CMyTreeCtrl m_Tree; ....... void CMyTreeCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here #ifdef _DEBUG afxDump << "OnClick\n"; #endif *pResult = 0; }
源代码中,ctreectrlview 是派生制public CView 而用MFC自己创建,它的派生关系是class CLeftView : public CTreeView 我只找到这个区别,不知道有什么不同。
schlafenhamster 2014-09-16
  • 打赏
  • 举报
回复
就是你说的那个 “MFCDRAG” 。 (不是 什么 CLeftView,, 他 自己有 TRee !!!!)
schlafenhamster 2014-09-16
  • 打赏
  • 举报
回复
“将派生的树类已经加入到了cview类,否者编译无法通过。” 不是 “加入” !!! 是叫你 把 原来微软程序(不是 什么 CLeftView)的 class CTreeCtrlView : public CView { protected: enum {NUM_BUTTONS = 9}; CTreeCtrl m_Tree; // 改 这个 变量 的 类 名 为 MYTREE。
yyang0514 2014-09-16
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
insert class: class CMyTreeCtrl : public CTreeCtrl {
将派生的树类已经加入到了cview类,否者编译无法通过。 在派生树类加入了两个消息NM_CLICK和LBUTTONDOWN都无法响应。 自定义树类消息响应

void MYTREE::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	MessageBox("MessageBox");
	*pResult = 0;
}


void MYTREE::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	MessageBox("MessageBox111");
	CTreeCtrl::OnLButtonDown(nFlags, point);
}

treeview类头文件

#include "MYTREE.h"
#pragma once

class Ctest3Doc;

class CLeftView : public CTreeView
{
protected: // 仅从序列化创建
	CLeftView();
	DECLARE_DYNCREATE(CLeftView)
	enum		{NUM_BUTTONS = 9};
	CTreeCtrl	m_Tree;
	CImageList	m_Image;
	CImageList* m_pDragImage;
	BOOL		m_bDragging;
	HTREEITEM	m_hDragItem, m_hDropItem;
	int			m_nDropIndex;
	CWnd*		m_pDropWnd;
	
// 特性
public:
	Ctest3Doc* GetDocument();

// 操作
public:

// 重写
	public:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	protected:
	virtual void OnInitialUpdate(); // 构造后第一次调用

// 实现
public:
	virtual ~CLeftView();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnSize(UINT nType, int cx, int cy);
};


schlafenhamster 2014-09-15
  • 打赏
  • 举报
回复
insert class: class CMyTreeCtrl : public CTreeCtrl {
schlafenhamster 2014-09-15
  • 打赏
  • 举报
回复
#include "MyTreeCtrl.h" class CTreeCtrlView : public CView { protected: enum {NUM_BUTTONS = 9}; CMyTreeCtrl m_Tree; ....... void CMyTreeCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here #ifdef _DEBUG afxDump << "OnClick\n"; #endif *pResult = 0; }
schlafenhamster 2014-09-15
  • 打赏
  • 举报
回复
添加了一个类:class MYTREE : public CTreeCtrl。 这个类要用上: 要改: (添加 .h) MYTREE m_Tree;
yyang0514 2014-09-15
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
所以问题很简单。 创建一个 类 叫 CYourTree 把: CTreeCtrl m_Tree; 改成 CYourTreel m_Tree; 然后在 CYourTree 里 响应 消息 (什么 都有!)
非常感谢你的帮助,但是用了这个方法也没有成功。 添加了一个类:class MYTREE : public CTreeCtrl。在view类中创建树。

VERIFY (m_Tree.Create (WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS |TVS_EDITLABELS , CRect (500, 500, 500, 500), this, IDI_ICON1));

添加NM_CLICK响应函数,在树的节点上点鼠标左键没有弹出对话框。

void MYTREE::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	MessageBox("MessageBox");
	*pResult = 0;
}
schlafenhamster 2014-09-12
  • 打赏
  • 举报
回复
所以问题很简单。 创建一个 类 叫 CYourTree 把: CTreeCtrl m_Tree; 改成 CYourTreel m_Tree; 然后在 CYourTree 里 响应 消息 (什么 都有!)
schlafenhamster 2014-09-12
  • 打赏
  • 举报
回复
那个程序的 tree 是: class CTreeCtrlView : public CView 他 派生至 CView, (非 CTreeView) , 所以 他本身没有 TreeCtrl 要 外加: class CTreeCtrlView : public CView { protected: enum {NUM_BUTTONS = 9}; CTreeCtrl m_Tree; CImageList m_Image; CImageList* m_pDragImage;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧