如何向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;
}
}
}
...全文
255 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;
内容概要:本文档围绕“风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真”展开,系统介绍了采用虚拟同步发电机(VSG)控制策略的风电与储能联合并网系统的建模与仿真方法。通过Simulink平台构建完整的电力系统动态模型,重点实现VSG的关键控制逻辑,以提升新能源并网的稳定性、惯性响应与频率支撑能力。文档不仅涵盖核心仿真模型,还整合了大量相关前沿研究内容,如混合储能调频、微电网优化、电动汽车可调能力评估、智能算法在电力系统的应用等,并提供丰富的Matlab/Simulink代码实例,具有较强的科研复现价值和技术参考意义。; 适合人群:具备电力系统基础理论知识和Matlab/Simulink仿真能力的研究生、科研人员及从事新能源发电、储能控制、智能电网等领域工作的工程技术人员;特别适用于正在开展风储协同控制、虚拟同步机、构网型变流器等相关课题研究的高校师生。; 使用场景及目标:① 深入理解虚拟同步发电机(VSG)在风储并网系统的控制原理与技术优势;② 借助提供的仿真模型与代码完成科研论文复现、算法验证与系统性能测试;③ 探索新能源高渗透背景下提升电网稳定性的关键技术路径,包括惯量模拟、一次频率响应、储能协同控制等。; 阅读建议:建议读者按照文档结构循序渐进地学习,优先下载并运行配套的Simulink模型与Matlab代码,结合VSG控制策略的设计细节进行调试与分析,同时可关注公众号“荔枝科研社”获取完整资源包及持续的技术支持,以提升科研效率与创新能力。

16,550

社区成员

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

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

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