+ -
当前位置:首页 → 问答吧 → mfc picture 控件 单击 双击 事件 急 !在线等!

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

时间:2011-12-13

来源:互联网

现在状态是:单击 双击 分别都能实现 ,但双击时会先执行单击事件 后才执行双击实现 ,怎样才能在双击时屏蔽掉单击事件 只执行双击?

作者: trojan_king   发布时间: 2011-12-13

这个...LZ有特殊需求?
这个是必然的啊,肯定先有单击,再有双击。
说说你的需求吧

作者: wangweixu520   发布时间: 2011-12-13

有个不靠谱的方法,在单击里面sleep(10),呵呵

作者: wangweixu520   发布时间: 2011-12-13

还有个方法,在pretranslatemessage里面做消息处理,这个还比较靠谱!

作者: wangweixu520   发布时间: 2011-12-13

引用 3 楼 wangweixu520 的回复:

还有个方法,在pretranslatemessage里面做消息处理,这个还比较靠谱!

这个也判断屏蔽不掉单击么

需求是:单击图片 传递一组数据到另一个图片
双击图片 :放大图片到全屏 但不要传递数据
纠结呀 !

作者: trojan_king   发布时间: 2011-12-13

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

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

C/C++ code


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


作者: bazzi2011   发布时间: 2011-12-13

这个不好判断吧。。双击的前奏就是单击。。。
那你可以判断在一定时间内单击两次就认定是双击。。

作者: shen_wei   发布时间: 2011-12-13

引用 5 楼 bazzi2011 的回复:

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

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

C/C++ code



clickInterval = 0;
void OnLButtonDown(UINT nFlags, CPoint……


ok 我试试 把条件放在单击里边判断

作者: trojan_king   发布时间: 2011-12-13

引用 7 楼 trojan_king 的回复:

引用 5 楼 bazzi2011 的回复:

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

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

C/C++ code



clickInterval = 0;
void OnLBu……


貌似不行 — —!

作者: trojan_king   发布时间: 2011-12-13

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

作者: Tidal_Choidi   发布时间: 2011-12-13

引用 9 楼 tidal_choidi 的回复:

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



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


另 :请教高手 重载控件是不是可以达到目的?

作者: trojan_king   发布时间: 2011-12-13

C/C++ code
// 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);
}

我测试了还可以。。你可以试试。。

作者: shen_wei   发布时间: 2011-12-13

引用 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……



我试了下 双击还是回触发单击 的操作、、
不信 你可以这样写双击响应:
[code=C/C++][/code]
void CButtonEx::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CString s;
GetWindowText(s);
  SetWindowText(s + _T("11111"));
  m_bButClick = TRUE;
  CButton::OnLButtonDblClk(nFlags, point);
}

结果会是 2222211111


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

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

作者: trojan_king   发布时间: 2011-12-13

这个帖子貌似可以,未测试
http://bbs.9ria.com/thread-30916-1-1.html

作者: zyrr159487   发布时间: 2011-12-13