MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置

MFC中,当在TreeCtrl控件中添加鼠标左键消息时,就意味着,凡是在该控件中点击左键后即会响应鼠标左键的消息,可有时我们只想记下有效的鼠标左键点击的事件,如图所示:

只想在CheckBox中点击鼠标左键时,将已选中的Item的句柄存入到链表中,那么如何只将有效的鼠标左键的消息存入链表中呢?

下面是响应鼠标左键消息时从所有鼠标左键消息都响应到只响应有效的左键消息的三个版本:

当响应鼠标左键的消息时,第一个版本:

获取鼠标的点击位置(注意:此时获取的是针对于当前屏幕的鼠标点击位置,所以需要将其转换为针对于当前控件的坐标点),然后根据坐标点获取当前鼠标点击时的句柄;

第二个版本:

也是先获取鼠标的点击位置,::MapWindowPoints将其转换为针对于当前控件的位置,根据位置获取句柄,通过if(TVHT_ONITEMSTATEICON & ht.flags)确认数遍左键的响应位置是否在CheckBox中,如果在的话添加入链表,如果不在,则不添加;

第三个版本:

在第二个版本上添加了if (this->GetCheck(ht.hItem) == FALSE),是为了防止鼠标左键点击两次复选框时响应了两次事件,添加到链表时添加了两次,当第一次在CheckBox上点击时,此时程序中的默认是未选中,所以在false时可以添加入链表,当再次点击相同位置时,由于此时该CheckBox选项已经变为true了,所以不会添加入链表中。

void CMyTreeCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
/*LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
HTREEITEM hCheckItem=pNMTreeView->itemNew.hItem;*/

//-------------------------第一个版本--------------------------------
//CPoint point;
//GetCursorPos(&point);
//ScreenToClient(&point);//获取当前客户区的鼠标点击位置
//HTREEITEM hItem=this->HitTest(point);//获取客户区指定坐标点的句柄
//-------------------------第一个版本--------------------------------

//-------------------------第二个版本--------------------------------
//TVHITTESTINFO ht = {0};
//DWORD dwpos = GetMessagePos();
//ht.pt.x = GET_X_LPARAM(dwpos);
//ht.pt.y = GET_Y_LPARAM(dwpos);
//::MapWindowPoints(HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1);
//TreeView_HitTest(pNMHDR->hwndFrom, &ht);
//if(TVHT_ONITEMSTATEICON & ht.flags)
//{
// CString t_strTest = this->GetItemText(ht.hItem);
// m_lst.push_back(ht.hItem);
//}
//-------------------------第二个版本--------------------------------

//-------------------------第三个版本--------------------------------
TVHITTESTINFO ht = {0};
DWORD dwpos = GetMessagePos();
ht.pt.x = GET_X_LPARAM(dwpos);
ht.pt.y = GET_Y_LPARAM(dwpos);
::MapWindowPoints(HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1);
TreeView_HitTest(pNMHDR->hwndFrom, &ht);
if(TVHT_ONITEMSTATEICON & ht.flags)
{
  if (this->GetCheck(ht.hItem) == FALSE)
  {
    CString t_strTest = this->GetItemText(ht.hItem);
    m_lst.push_back(ht.hItem);
  }
}
//-------------------------第三个版本--------------------------------

*pResult = 0;
}

时间: 2024-10-06 00:28:11

MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置的相关文章

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法. ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾水. 一.静态显示bmp图片

如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件)

如何在CRichEditCtrl控件中直接读如RTF格式的文件 Inserting an RTF string using StreamIn -------------------------------------------------------------------------------- When inserting Rich Text Formatted text into the control there are two approaches you can take. In

winfrom中DataGridView绑定数据控件中DataGridViewCheckBoxColumn怎么选中

for (int i = 0; i < this.dataGridView1.Rows.Count; i++) { this.dataGridView1.Rows[i].Cells["CheckBoxCulums"].Value = this.checkBox1.Checked; } winfrom中DataGridView绑定数据控件中DataGridViewCheckBoxColumn怎么选中,布布扣,bubuko.com

MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/details/5866213 二.在对话框中创建视图(我这里创建的是一个滚动视图): 见博文: http://blog.csdn.net/clever101/article/details/4873994 http://blog.csdn.net/clever101/article/details/37790

将MenuStrip控件中的信息添加到TreeView控件中【转载】

本文详细介绍怎样将MenuStrip控件中的信息添加到TreeView控件中 首先在WinForm窗体中添加一个MenuStrip控件和TreeView控件,根据个人的爱好把控件布局好后.在窗体的加载事件中(根据自己的情况而定)添加如下的代码: /// <summary>   /// 窗体加载时事件   /// </summary>   /// <param name="sender"></param>   /// <param n

怎样在VS2013/MFC中使用TeeChart绘图控件

TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在VS2013中如何创建MFC项目. 工具/原料 Visual studio 2013 TeeChart.pro.v5.ActiveX 方法/步骤 1 在网上下载TeeChart控件并安装,安装自然不用多说,安装完后找到安装路径(带有TeeChart5.ocx文件),复制当前路径 2 安装完后需要对控件

VC/MFC 在ListCtl 控件中随鼠标移动提示单元格信息

[cpp] view plaincopy BEGIN_MESSAGE_MAP(CTipListCtrl, CListCtrl) //{{AFX_MSG_MAP(CTipListCtrl) ON_WM_MOUSEMOVE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTipLis

OpenCV 2.2版本以上显示图片到 MFC 的 Picture Control 控件中

OpenCV 2.2 以及后面的版本取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序员无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上很多人表示只要将那两个文件人为的提取出来然后放到工程里面就解决问题了,也提供了两个文件的下载,但是这麻烦不说,还会导致一些奇奇怪怪的报错(至少本人是这样的,很崩溃!).所以在了解了一些gdi绘图之后结合网上的代码写了如下的函数,只需调用就可以将OpenCV的图片显示在上面

OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上非常多人表示仅仅要将那两个文件人为的提取出来然后放到project里面就解决这个问题了,也提供了两个文件的下载,可是这麻烦不说.还会导致一些奇奇怪怪的报错(至少本人是这种,非常崩溃!).所以在了解了一些gdi画图之后结合网上的代码写了例如以下的函数,仅仅需调用就能够将O