CTreeCtrl有没有单击"+ "的事件???很急,谢谢!!! 我想单击"+",展开树,有没有这样的时间.谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 查查MSDN,或在VC的ClassWizard中直接看看。 重载CTreeCtrl类的TVN_ITEMEXPANDED消息响应函数OnItemexpanded,实现如下。void CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here if (pNMTreeView->action & TVE_EXPAND) { AfxMessageBox("TVE_EXPAND"); } else if (pNMTreeView->action & TVE_COLLAPSE) { AfxMessageBox("TVE_COLLAPSE"); } *pResult = 0;} 不会吧,以下是我做的测试类,请替换你的CTreeCtrl类试一下,祝成功//1、MyTreeCtrl.h 文件#if !defined(AFX_MYTREECTRL_H__92CB2FE8_DBFA_409A_980B_3F01CD289545__INCLUDED_)#define AFX_MYTREECTRL_H__92CB2FE8_DBFA_409A_980B_3F01CD289545__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// MyTreeCtrl.h : header file///////////////////////////////////////////////////////////////////////////////// CMyTreeCtrl windowclass CMyTreeCtrl : public CTreeCtrl{// Constructionpublic: CMyTreeCtrl();// Attributespublic:// Operationspublic:// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyTreeCtrl) //}}AFX_VIRTUAL// Implementationpublic: virtual ~CMyTreeCtrl(); // Generated message map functionsprotected: //{{AFX_MSG(CMyTreeCtrl) afx_msg void OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_MYTREECTRL_H__92CB2FE8_DBFA_409A_980B_3F01CD289545__INCLUDED_)//2、MyTreeCtrl.cpp 文件// MyTreeCtrl.cpp : implementation file//#include "stdafx.h"#include "CYourAPPClass.h"#include "MyTreeCtrl.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMyTreeCtrlCMyTreeCtrl::CMyTreeCtrl(){}CMyTreeCtrl::~CMyTreeCtrl(){}BEGIN_MESSAGE_MAP(CMyTreeCtrl, CTreeCtrl) //{{AFX_MSG_MAP(CMyTreeCtrl) ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded) //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyTreeCtrl message handlersvoid CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here if (pNMTreeView->action & TVE_EXPAND) { AfxMessageBox("TVE_EXPAND"); } else if (pNMTreeView->action & TVE_COLLAPSE) { AfxMessageBox("TVE_COLLAPSE"); } *pResult = 0;} 另外单击的时候发送双击事件,这也不能解决我的问题,我的问题是单击树的某一项的文字并不展开,而是单击前面的"+"才展开树.本来对于一个树控件单击某一项文字也不会展开的啊!单击事件可以用OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)来响应,比较好。树控件默认的是双击某一项文字展开树,但如果你不想双击展开的话,可以把*pResult = 0;改为*pResult = 1;就行了。至于你具体想作什么,自己添代码就行了。 我记得好象默认的单击+就可以展开在CTreeCtrl的style or styleex中选中 显示+ 连线到根 树项使用ICON 好像没有那样的消息,不过你可以“曲线救国”。虽然没有单击+的消息,可我发现单击+的时候却没触发Item的selchanged()你试试重载selchanged()或者selchanging(),在那里做文章。 靠,在属性里设置就行了,将Has Button 设置为真! CTreeCtrl不是有TVN_ITEMEXPANDED和TVN_ITEMEXPANDING两个消息吗?直接处理就行了呗 处理NM_CLICK事件就可以了;void CXXX::OnNMClick(NMHDR *pNMHDR, LRESULT* pResult) {POINT pt = GetCurrentMessage()->pt;ScreenToClient(&pt);TVHITTESTINFO tvht; //大概是这个结构tvht.pt = pt;HitTest(&tvht);if(tvht.flags == ONITEMBUTTON){//click the "+";}...} OnItemexpanded 展开或关闭树的时候进入,可以实现你的功能 求教combo box控件中字符串的提取问题 怎么设置程序忙碌时的光标? 在DLL中使用异步socket的问题 继承CRecordset类开发的问题 重回首 再学MFC 请大家指点一下方法 那位师傅有Visual C++ 实践与提高—图形图像编程篇的 源码,给老弟一份 向量变量名的rg前缀是什么意思,那个单词的缩写? 一定要学《windows 程序设计》(Charles Petzold)吗? CDC指针传递问题 32位汇编,和16位汇编有什么差别? 哪能下载到Matcom、Mideva ClistCtrl问题?
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if (pNMTreeView->action & TVE_EXPAND)
{
AfxMessageBox("TVE_EXPAND");
}
else if (pNMTreeView->action & TVE_COLLAPSE)
{
AfxMessageBox("TVE_COLLAPSE");
}
*pResult = 0;
}
#define AFX_MYTREECTRL_H__92CB2FE8_DBFA_409A_980B_3F01CD289545__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyTreeCtrl.h : header file
///////////////////////////////////////////////////////////////////////////////
// CMyTreeCtrl windowclass CMyTreeCtrl : public CTreeCtrl
{
// Construction
public:
CMyTreeCtrl();// Attributes
public:// Operations
public:// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyTreeCtrl)
//}}AFX_VIRTUAL// Implementation
public:
virtual ~CMyTreeCtrl(); // Generated message map functions
protected:
//{{AFX_MSG(CMyTreeCtrl)
afx_msg void OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG DECLARE_MESSAGE_MAP()
};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_MYTREECTRL_H__92CB2FE8_DBFA_409A_980B_3F01CD289545__INCLUDED_)//2、MyTreeCtrl.cpp 文件// MyTreeCtrl.cpp : implementation file
//#include "stdafx.h"
#include "CYourAPPClass.h"
#include "MyTreeCtrl.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CMyTreeCtrlCMyTreeCtrl::CMyTreeCtrl()
{
}CMyTreeCtrl::~CMyTreeCtrl()
{
}
BEGIN_MESSAGE_MAP(CMyTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CMyTreeCtrl)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMyTreeCtrl message handlersvoid CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if (pNMTreeView->action & TVE_EXPAND)
{
AfxMessageBox("TVE_EXPAND");
}
else if (pNMTreeView->action & TVE_COLLAPSE)
{
AfxMessageBox("TVE_COLLAPSE");
}
*pResult = 0;
}
OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)来响应,比较好。树控件默认的是
双击某一项文字展开树,但如果你不想双击展开的话,可以把
*pResult = 0;改为*pResult = 1;就行了。至于你具体想作什么,自己添代码就行了。
显示+
连线到根
树项使用ICON
你试试重载selchanged()或者selchanging(),在那里做文章。
void CXXX::OnNMClick(NMHDR *pNMHDR, LRESULT* pResult)
{
POINT pt = GetCurrentMessage()->pt;
ScreenToClient(&pt);TVHITTESTINFO tvht; //大概是这个结构
tvht.pt = pt;
HitTest(&tvht);
if(tvht.flags == ONITEMBUTTON)
{
//click the "+";
}
...
}