CListCtrl区别鼠标主键单击和双击

cbzjzsb123 2016-12-07 01:46:26
由于鼠标左键双击会自动进入鼠标左键单击的消息,现在需要双击时屏蔽掉左键单击的消息。

在网上搜到了个方法

void CMyListCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)

DWORD dwStart = GetTickCount();

MSG msg;
while(1)//循环检索消息队列
{
if(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);

if(msg.message == NM_DBLCLK)
{
TRACE("单击消息返回!");
return;
}
}

DWORD dwEnd = GetTickCount();
if(dwEnd - dwStart > 2000)
break;
}


结果 if(msg.message == NM_DBLCLK)这个函数永远进不去,也就是msg.message永远不等于NM_DBLCLK,不知道这是为什么
...全文
471 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-12-08
  • 打赏
  • 举报
回复
试试新窗口弹出后 PostMessage(WM_CANCELMODE,0,0);
AfxMessageBox("haha");// 新窗口
PostMessage(WM_CANCELMODE,0,0);
cbzjzsb123 2016-12-07
  • 打赏
  • 举报
回复
我的问题跟这个问题是一样的 http://bbs.csdn.net/topics/300158257不知道有没有人能解决。
cbzjzsb123 2016-12-07
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
*pResult = 0;
这句话有什么用啊?
schlafenhamster 2016-12-07
  • 打赏
  • 举报
回复
*pResult = 0;
cbzjzsb123 2016-12-07
  • 打赏
  • 举报
回复
引用 13 楼 hurryboylqs 的回复:
NM_DBLCLK并不是一个普通的message 而是一个notify message 响应 WM_NOTIFY 来处理
这个用代码怎么写的?
cbzjzsb123 2016-12-07
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
ON_NOTIFY(NM_CLICK, IDC_LIST, OnClick) ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblClick) // OnClick // // This method shows how to handle NM_CLICK messages from XListCtrl // void CXListCtrlTestDlg::OnClick(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); int nItem = -1; int nSubItem = -1; if (pNMIA) { nItem = pNMIA->iItem; nSubItem = pNMIA->iSubItem; } // TRACE(_T("in CXListCtrlTestDlg::OnClick: %d, %d\n"), nItem, nSubItem); *pResult = 0; } /////////////////////////////////////////////////////////////////////////////// // OnDblClick // // This method shows how to handle NM_DBLCLK messages from XListCtrl // void CXListCtrlTestDlg::OnDblClick(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); int nItem = -1; int nSubItem = -1; if (pNMIA) { nItem = pNMIA->iItem; nSubItem = pNMIA->iSubItem; } // TRACE(_T("in CXListCtrlTestDlg::OnDblClick: %d, %d\n"), nItem, nSubItem); *pResult = 0; }
大神,我不是要使用单击和双击消息。而是要在使用双击消息的时候不进入单击消息。
hurryboylqs 2016-12-07
  • 打赏
  • 举报
回复
NM_DBLCLK并不是一个普通的message 而是一个notify message 响应 WM_NOTIFY 来处理
schlafenhamster 2016-12-07
  • 打赏
  • 举报
回复
ON_NOTIFY(NM_CLICK, IDC_LIST, OnClick)
ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblClick)

// OnClick
//
// This method shows how to handle NM_CLICK messages from XListCtrl
//
void CXListCtrlTestDlg::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
int nItem = -1;
int nSubItem = -1;
if (pNMIA)
{
nItem = pNMIA->iItem;
nSubItem = pNMIA->iSubItem;
}
// TRACE(_T("in CXListCtrlTestDlg::OnClick: %d, %d\n"), nItem, nSubItem);

*pResult = 0;
}

///////////////////////////////////////////////////////////////////////////////
// OnDblClick
//
// This method shows how to handle NM_DBLCLK messages from XListCtrl
//
void CXListCtrlTestDlg::OnDblClick(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
int nItem = -1;
int nSubItem = -1;
if (pNMIA)
{
nItem = pNMIA->iItem;
nSubItem = pNMIA->iSubItem;
}
// TRACE(_T("in CXListCtrlTestDlg::OnDblClick: %d, %d\n"), nItem, nSubItem);

*pResult = 0;
}
三岁、就很帅 2016-12-07
  • 打赏
  • 举报
回复
msg.message == NM_DBLCLK //这个地方是不对的 单击跟双击的message id都是275 没变~
三岁、就很帅 2016-12-07
  • 打赏
  • 举报
回复
你要不加我QQ吧 回贴太慢了 1090947849
cbzjzsb123 2016-12-07
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
NM_CLICK/NM_DBLCLK
用的就是这两个啊,但是响应NM_DBLCLK消息时会执行NM_CLICK这个消息。
三岁、就很帅 2016-12-07
  • 打赏
  • 举报
回复
msg.message == NM_DBLCLK //这个地方是不对的 单击跟双击的message id都是275 没变~
引用 7 楼 cbzjzsb123 的回复:
[quote=引用 4 楼 swwllx 的回复:] public: afx_msg void OnClickList1(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult); ON_NOTIFY(NM_CLICK, IDC_LIST1, &CClistControlTestDlg::OnClickList1) ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CClistControlTestDlg::OnDblclkList1) void CClistControlTestDlg::OnClickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 MessageBox("单击事件"); *pResult = 0; } void CClistControlTestDlg::OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 MessageBox("双击事件"); *pResult = 0; }
引用 5 楼 swwllx 的回复:
应该是你添加单击跟双击消息的方式不对 用类向导添加
你是用VS吗?我用的VC6.0,测试了,双击的时候是先执行一次单机的操作,再进行双击的操作。[/quote]
引用 7 楼 cbzjzsb123 的回复:
[quote=引用 4 楼 swwllx 的回复:] public: afx_msg void OnClickList1(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult); ON_NOTIFY(NM_CLICK, IDC_LIST1, &CClistControlTestDlg::OnClickList1) ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CClistControlTestDlg::OnDblclkList1) void CClistControlTestDlg::OnClickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 MessageBox("单击事件"); *pResult = 0; } void CClistControlTestDlg::OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 MessageBox("双击事件"); *pResult = 0; }
引用 5 楼 swwllx 的回复:
应该是你添加单击跟双击消息的方式不对 用类向导添加
你是用VS吗?我用的VC6.0,测试了,双击的时候是先执行一次单机的操作,再进行双击的操作。[/quote] 我用的VS VC6.0也有类向导的啊 菜单栏 项目里面 类向导
cbzjzsb123 2016-12-07
  • 打赏
  • 举报
回复
引用 4 楼 swwllx 的回复:
public: afx_msg void OnClickList1(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult); ON_NOTIFY(NM_CLICK, IDC_LIST1, &CClistControlTestDlg::OnClickList1) ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CClistControlTestDlg::OnDblclkList1) void CClistControlTestDlg::OnClickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 MessageBox("单击事件"); *pResult = 0; } void CClistControlTestDlg::OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 MessageBox("双击事件"); *pResult = 0; }
引用 5 楼 swwllx 的回复:
应该是你添加单击跟双击消息的方式不对 用类向导添加
你是用VS吗?我用的VC6.0,测试了,双击的时候是先执行一次单机的操作,再进行双击的操作。
Eleven 2016-12-07
  • 打赏
  • 举报
回复
NM_CLICK/NM_DBLCLK
三岁、就很帅 2016-12-07
  • 打赏
  • 举报
回复
应该是你添加单击跟双击消息的方式不对 用类向导添加
三岁、就很帅 2016-12-07
  • 打赏
  • 举报
回复

public:
afx_msg void OnClickList1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);


ON_NOTIFY(NM_CLICK, IDC_LIST1, &CClistControlTestDlg::OnClickList1)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CClistControlTestDlg::OnDblclkList1)


void CClistControlTestDlg::OnClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
MessageBox("单击事件");
*pResult = 0;
}


void CClistControlTestDlg::OnDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
MessageBox("双击事件");
*pResult = 0;
}
三岁、就很帅 2016-12-07
  • 打赏
  • 举报
回复
项目->类向导->选中你的ListControl控件 添加 NM_CLICK NM_DBLCLK消息 分别是单击 双击 双击的时候并不会出现单击事件
cbzjzsb123 2016-12-07
  • 打赏
  • 举报
回复
引用 1 楼 swwllx 的回复:
你是否已经写了双击消息处理函数了
写了
三岁、就很帅 2016-12-07
  • 打赏
  • 举报
回复
你是否已经写了双击消息处理函数了

16,472

社区成员

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

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

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