首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CListCtrl。双击始终接收NM_CLICK + NM_DBLCLK时

CListCtrl。双击始终接收NM_CLICK + NM_DBLCLK时
EN

Stack Overflow用户
提问于 2015-09-12 20:06:51
回答 1查看 2.4K关注 0票数 1

当我用鼠标双击时,我总是得到两条消息NM_CLICKNM_DBLCLK。为什么?

你知道我该如何区分两者吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-12 22:13:09

当我用鼠标双击时,我总是得到两条消息NM_CLICK和NM_DBLCLK。为什么?

简短的回答:因为系统没有实现时间机器。

当您用鼠标单击时,系统会生成一个NM_CLICK通知,因为它还不知道这是否是双击序列的开始。这允许应用程序立即响应鼠标单击事件,而无需等待双击超时过期。

要区分单次单击和双击,您必须推迟对NM_CLICK的处理,直到您知道它不是NM_DBLCLK序列的一部分。为此,请在NM_CLICK处理程序中设置一个定时器,并从NM_DBLCLK中删除定时器。当计时器过期时,您知道没有NM_DBLCLK尾随,您可以继续处理单次单击。

以下应该给您一个想法,如何实现这一点:

代码语言:javascript
复制
enum TimerId {
    TimerId_ListCtrlDblClk = 1
};


BOOL CMyDialog::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ) {
    const NMHDR& hdr = *(const NMHDR*)lParam;
    switch ( hdr.code ) {
    case NM_CLICK:
        SetTimer( TimerId_ListCtrlDblClk, ::GetDoubleClickTime(), nullptr );
        *pResult = 0;
        return TRUE;

    case NM_DBLCLK:
        KillTimer( TimerId_ListCtrlDblClk );
        // Handle double-clicks here.
        *pResult = 0;
        return TRUE;

    default:
        break;
    }

    return CDialogEx::OnNotify( wParam, lParam, pResult );
}

void CMyDialog::OnTimer( UINT_PTR nIDEvent ) {
    if ( nIDEvent == TimerId_ListBoxDblClk ) {
        // If this timer expires, there is no NM_DBLCLK trailing the NM_CLICK.
        // Handle the regular NM_CLICK notification.
    }

    CDialogEx::OnTimer( nIDEvent );
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32543207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档