博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Duilib扩展《01》— 双击、右键消息扩展
阅读量:5234 次
发布时间:2019-06-14

本文共 1358 字,大约阅读时间需要 4 分钟。

用过duilib的可能会发现,duilib中有些控件没能很好的区分左键、右键等消息。所以根据实际需要,我们需要进行相关区分处理,或者自行扩展。


一. 左键、右键消息区分

我们以CListUI控件来分析说明。对于CListUI控件,在实际应用中有时我们需要响应双击或右键消息来执行不同操作,而目前的duilib中CListUI控件Item选择是无法区分左键右键消息的,究其原因duilib中对这块的处理都是发送的itemclick消息。具体可查看duilib中UIList.cpp文件中CListContainerElementUI::DoEvent部分的源码的处理:

if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_RBUTTONDOWN ){   if( IsEnabled() ){       m_pManager->SendNotify(this, DUI_MSGTYPE_ITEMCLICK);       Select();       Invalidate();   }   return;}

解决的办法可以区分type类型发送不同的event。 


二. 消息扩展

我们以添加双击消息为例来说明。在中,我们已经简单了提到了duilib中对相关操作的自定义的消息类型,可以在duilib工程中的UIDefine.h中查看。

1)消息定义

类似的,我们扩展消息也需要在此添加。我们可以发现在UIDefine.h中已经定义了click的消息:#define DUI_MSGTYPE_CLICK   (_T(“click”)),却没看到双击消息。对应的,我们在此处添加一个双击消息:#define DUI_MSGTYPE_DBCLICK   (_T(“dbclick”))

2)消息传递

在UIManager.h文件中我们可以看到已经定义了UIEVENT_DBLCLICK、UIEVENT_RBUTTONDOWN等事件消息,这是因为它的右键和双击等消息只给了内部的控件使用,我们需要将其传递出来,所以在UIControl.cpp文件的CControlUI::DoEvent中传递双击消息。如下:

if( event.Type == UIEVENT_DBLCLICK ){    m_pManager->SendNotify(this, DUI_MSGTYPE_DBCLICK, event.wParam, event.lParam);    // return;}

提醒:这里不要return,因为双击消息UIEVENT_DBLCLICK还需要传递给List等控件。

3)消息处理

最后,在外部使用时,在Notify函数中根据实际情况进行消息判断处理:

if( msg.sType == _T("dbclick"))  {         // 此处会传递很多次双击消息,所以只获取父类控件的消息    if (! msg.pSender->GetParent())    {       // ...    }}

这样一来,即可响应双击消息。

转载于:https://www.cnblogs.com/MrYuan/p/4971881.html

你可能感兴趣的文章
discuz 常用脚本格式化数据
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
JavaScript 鸭子模型
查看>>
SQL Server 如何查询表定义的列和索引信息
查看>>
GCD 之线程死锁
查看>>
NoSQL数据库常见分类
查看>>
一题多解 之 Bat
查看>>
Java 内部类
查看>>
{面试题7: 使用两个队列实现一个栈}
查看>>
【练习】使用事务和锁定语句
查看>>
centos7升级firefox的flash插件
查看>>
Apache Common-IO 使用
查看>>
评价意见整合
查看>>
二、create-react-app自定义配置
查看>>
Android PullToRefreshExpandableListView的点击事件
查看>>