mfc picture 控件 单击 双击 事件 急 !在线等!

trojan_king 2011-12-13 09:18:28
现在状态是:单击 双击 分别都能实现 ,但双击时会先执行单击事件 后才执行双击实现 ,怎样才能在双击时屏蔽掉单击事件 只执行双击?
...全文
384 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2011-12-13
  • 打赏
  • 举报
回复
// ButtonEx.cpp : 实现文件
//

#include "stdafx.h"
#include "CExcelDlg.h"
#include "ButtonEx.h"


// CButtonEx

IMPLEMENT_DYNAMIC(CButtonEx, CButton)

CButtonEx::CButtonEx()
{
m_nButClick = 0;
m_bButClick = FALSE;
}

CButtonEx::~CButtonEx()
{

}


BEGIN_MESSAGE_MAP(CButtonEx, CButton)
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()

// CButtonEx 消息处理程序

void CButtonEx::OnLButtonDblClk(UINT nFlags, CPoint point)
{
SetWindowText(_T("11111"));
m_bButClick = TRUE;
CButton::OnLButtonDblClk(nFlags, point);
}

void CButtonEx::OnLButtonDown(UINT nFlags, CPoint point)
{
//SetWindowText(_T("22222"));

CButton::OnLButtonDown(nFlags, point);
}

void CButtonEx::OnLButtonUp(UINT nFlags, CPoint point)
{
m_nButClick++;
SetTimer(1,5,NULL);
if (m_bButClick)
{
m_bButClick = FALSE;
return;
}
SetWindowText(_T("22222"));
CButton::OnLButtonUp(nFlags, point);
}

void CButtonEx::OnTimer(UINT_PTR nIDEvent)
{
if (m_nButClick == 2)
{
KillTimer(1);
m_bButClick = TRUE;
}
CButton::OnTimer(nIDEvent);
}
我测试了还可以。。你可以试试。。
trojan_king 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tidal_choidi 的回复:]

分别在LButtonDown、LButtonDblClk两个消息函数中处理你的需求不行吗?
[/Quote]


问题是 LButtonDblClk的消息会先触发LButtonDown的消息 也就是 双击事件发生时肯定会发生单击事件 这时 怎么屏蔽掉单击事件而只执行双击事件?


另 :请教高手 重载控件是不是可以达到目的?
Tidal_Choidi 2011-12-13
  • 打赏
  • 举报
回复
分别在LButtonDown、LButtonDblClk两个消息函数中处理你的需求不行吗?
trojan_king 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 trojan_king 的回复:]

引用 5 楼 bazzi2011 的回复:

网上查到的,试了下,还可以!

如果LButtonDown和LButtonDblClk同时有实现的话
总会实现单击消息,在网上找解决方法,思想是在单击消息实现中取时间,计算两次单击事件的时间差
来回尝试修改,最后成这个样子,还算简单明了

C/C++ code



clickInterval = 0;
void OnLBu……
[/Quote]

貌似不行 — —!
trojan_king 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bazzi2011 的回复:]

网上查到的,试了下,还可以!

如果LButtonDown和LButtonDblClk同时有实现的话
总会实现单击消息,在网上找解决方法,思想是在单击消息实现中取时间,计算两次单击事件的时间差
来回尝试修改,最后成这个样子,还算简单明了

C/C++ code



clickInterval = 0;
void OnLButtonDown(UINT nFlags, CPoint……
[/Quote]

ok 我试试 把条件放在单击里边判断
shen_wei 2011-12-13
  • 打赏
  • 举报
回复
这个不好判断吧。。双击的前奏就是单击。。。
那你可以判断在一定时间内单击两次就认定是双击。。
bazzi2011 2011-12-13
  • 打赏
  • 举报
回复
网上查到的,试了下,还可以!

如果LButtonDown和LButtonDblClk同时有实现的话
总会实现单击消息,在网上找解决方法,思想是在单击消息实现中取时间,计算两次单击事件的时间差
来回尝试修改,最后成这个样子,还算简单明了




clickInterval = 0;
void OnLButtonDown(UINT nFlags, CPoint point)
{
if(GetTickCount() - clickInterval < GetDoubleClickTime())
{
this->OnLButtonDblClk(nFlags, point);
return;
}
clickInterval = GetTickCount();
}

trojan_king 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangweixu520 的回复:]

还有个方法,在pretranslatemessage里面做消息处理,这个还比较靠谱!
[/Quote]
这个也判断屏蔽不掉单击么

需求是:单击图片 传递一组数据到另一个图片
双击图片 :放大图片到全屏 但不要传递数据
纠结呀 !
wangweixu520 2011-12-13
  • 打赏
  • 举报
回复
还有个方法,在pretranslatemessage里面做消息处理,这个还比较靠谱!
wangweixu520 2011-12-13
  • 打赏
  • 举报
回复
有个不靠谱的方法,在单击里面sleep(10),呵呵
wangweixu520 2011-12-13
  • 打赏
  • 举报
回复
这个...LZ有特殊需求?
这个是必然的啊,肯定先有单击,再有双击。
说说你的需求吧
shen_wei 2011-12-13
  • 打赏
  • 举报
回复
GetWindowText(s);
SetWindowText(s + _T("11111"));
这样当然是 22222211111 了

接受单击事件,开始计数,在一定时间内是两次,就是双击,否则就是单击!!!
zyrr159487 2011-12-13
  • 打赏
  • 举报
回复
这个帖子貌似可以,未测试
http://bbs.9ria.com/thread-30916-1-1.html
trojan_king 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shen_wei 的回复:]

C/C++ code
// ButtonEx.cpp : 实现文件
//

#include "stdafx.h"
#include "CExcelDlg.h"
#include "ButtonEx.h"


// CButtonEx

IMPLEMENT_DYNAMIC(CButtonEx, CButton)

CButtonEx::CButtonEx()
{
m_nButClick……
[/Quote]


我试了下 双击还是回触发单击 的操作、、
不信 你可以这样写双击响应:

void CButtonEx::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CString s;
GetWindowText(s);
SetWindowText(s + _T("11111"));
m_bButClick = TRUE;
CButton::OnLButtonDblClk(nFlags, point);
}

结果会是 2222211111


所以我采用的方法是:
在双击事件中撤销单击事件的操作、、、

期待高手给出更好 的方法 — —!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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