duilib消息处理

解析duilib 消息处理函数-笔记1 界面消息传递机制, 通过宏定义点击事件处理方法。 来看一下 主要消息的处理宏展开是什么情况 wndProc-----> HandleMessage--->func1....funcn ----->CpaintManagerUI:MessageHandleer  ----->CwindowWnd::HandleMessage: (1)声明了几个函数参数 LRESULT Ha 阅读详情

一. 系统消息

窗体显示的时候我们就已经说了,窗体是继承CWindowWnd类的,对于窗体的部分消息的处理,需要重载该类的LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); 函数。在显示窗体部分我们创建窗体WM_CREATE消息以及屏蔽标题栏WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT等消息 都是在HandleMessage中进行处理:

1 LRESULT CMainWndDlg::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam )
2 {
3     LRESULT lRes = 0;
4     BOOL bHandled = TRUE;
5  
6     switch( uMsg )
7     {
8     case WM_CREATE:        lRes = OnCreate(uMsg, wParam, lParam, bHandled); break;
9     case WM_NCACTIVATE:    lRes = OnNcActivate(uMsg, wParam, lParam, bHandled); break;
10     case WM_NCCALCSIZE:    lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break;
11     case WM_NCPAINT:       lRes = OnNcPaint(uMsg, wParam, lParam, bHandled); break;
12     case WM_NCHITTEST:     lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled); break;
13     case WM_CLOSE:         lRes = OnClose(uMsg, wParam, lParam, bHandled); break;
14     case WM_DESTROY:       lRes = OnDestroy(uMsg, wParam, lParam, bHandled); break;
15     case WM_SIZE:          lRes = OnSize(uMsg, wParam, lParam, bHandled); break;
16     case WM_GETMINMAXINFO: lRes = OnGetMinMaxInfo(uMsg, wParam, lParam, bHandled); break;
17     case WM_SYSCOMMAND:    lRes = OnSysCommand(uMsg, wParam, lParam, bHandled); break;
18     case WM_KEYDOWN:       PostQuitMessage(0); break;
19     default:
20         bHandled = FALSE;
21     }
22  
23     if( bHandled ) return lRes;
24     if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
25  
26     return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
27 }

如同代码中所示,如果消息不需要框架再处理了则直接返回。如果还需要框架处理该消息,则交由父类的HandleMessge中去处理。

 

二. 事件消息

对于系统消息我们直接重载了HandleMessage来处理,而对于鼠标点击一类的消息呢?为此,我们的窗体除了要继承CWindowWnd外,还需要继承INotifyUI,同样的重载INotifyUI类中的void Notify(TNotifyUI& msg); 函数,由该函数来处理控件操作产生的消息。但仅仅只是继承重载了还不够,我们怎么才能确保事件消息能正常传递呢?因此,在窗体创建OnCreate的时候,我们还需要添加如下m_PaintManager.AddNotifier(this); 这样,控件消息就可以传达大duilib的消息循环中,我们也就可以通过Notify函数对消息进行处理:

1 void CMainWndDlg::Notify( TNotifyUI& msg )
2 {
3     if( msg.sType == _T("windowinit") ) {
4         OnWindowInit();
5     }
6     else if( msg.sType == _T("click") ) {
7         if( msg.pSender == m_pCloseBtn ) {
8             PostQuitMessage(0);
9             return;
10         }
11         else if( msg.pSender == m_pMinBtn ) {
12             SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0); return; }
13         else if( msg.pSender == m_pMaxBtn ) {
14             SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0); return; }
15         else if( msg.pSender == m_pRestoreBtn ) {
16             SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0); return; }
17  
18         // 按钮消息
19         OnLBtnClick(msg.pSender);
20     }
21     else if(msg.sType==_T("selectchanged"))
22     {
23         CDuiString name = msg.pSender->GetName();
24         CTabLayoutUI* pTabSwitch = static_cast<CTabLayoutUI*>(m_PaintManager.FindControl(_T("tab_switch")));
25         CTabLayoutUI* pDemoListSwitch = static_cast<CTabLayoutUI*>(m_PaintManager.FindControl(_T("demo_list_tab_switch")));
26  
27         if(name.CompareNoCase(_T("demo_tab")) == 0)
28             pTabSwitch->SelectItem(0);
29         else if(name.CompareNoCase(_T("web_tab")) == 0)
30             pTabSwitch->SelectItem(1);
31  
32         if(name.CompareNoCase(_T("demo_list_basic_ctrl")) == 0)
33             pDemoListSwitch->SelectItem(0);
34         else if(name.CompareNoCase(_T("demo_list_rich_ctrl")) == 0)
35             pDemoListSwitch->SelectItem(1);
36     }
37 }

在Notify函数中针对消息的不同进行不同的操作处理,比如click、selectchanged等等。对于这类duilib针对相关操作自定义的消息类型可以在duilib工程中的UIDefine.h文件中查看:

1 //定义所有消息类型
2 //////////////////////////////////////////////////////////////////////////
3  
4 #define DUI_MSGTYPE_MENU                   (_T("menu"))
5 #define DUI_MSGTYPE_LINK                   (_T("link"))
6  
7 #define DUI_MSGTYPE_TIMER                  (_T("timer"))
8 #define DUI_MSGTYPE_CLICK                  (_T("click"))
9  
10 #define DUI_MSGTYPE_RETURN                 (_T("return"))
11 #define DUI_MSGTYPE_SCROLL                 (_T("scroll"))
12  
13 #define DUI_MSGTYPE_DROPDOWN               (_T("dropdown"))
14 #define DUI_MSGTYPE_SETFOCUS               (_T("setfocus"))
15  
16 #define DUI_MSGTYPE_KILLFOCUS              (_T("killfocus"))
17 #define DUI_MSGTYPE_ITEMCLICK              (_T("itemclick"))
18 #define DUI_MSGTYPE_TABSELECT              (_T("tabselect"))
19  
20 #define DUI_MSGTYPE_ITEMSELECT             (_T("itemselect"))
21 #define DUI_MSGTYPE_ITEMEXPAND             (_T("itemexpand"))
22 #define DUI_MSGTYPE_WINDOWINIT             (_T("windowinit"))
23 #define DUI_MSGTYPE_BUTTONDOWN             (_T("buttondown"))
24 #define DUI_MSGTYPE_MOUSEENTER             (_T("mouseenter"))
25 #define DUI_MSGTYPE_MOUSELEAVE             (_T("mouseleave"))
26  
27 #define DUI_MSGTYPE_TEXTCHANGED            (_T("textchanged"))
28 #define DUI_MSGTYPE_HEADERCLICK            (_T("headerclick"))
29 #define DUI_MSGTYPE_ITEMDBCLICK            (_T("itemdbclick"))
30 #define DUI_MSGTYPE_SHOWACTIVEX            (_T("showactivex"))
31  
32 #define DUI_MSGTYPE_ITEMCOLLAPSE           (_T("itemcollapse"))
33 #define DUI_MSGTYPE_ITEMACTIVATE           (_T("itemactivate"))
34 #define DUI_MSGTYPE_VALUECHANGED           (_T("valuechanged"))
35  
36 #define DUI_MSGTYPE_SELECTCHANGED          (_T("selectchanged"))
37  
38 //////////////////////////////////////////////////////////////////////////

三. 消息过滤

在实际中,我们有时候可能需要根据需要对部分消息进行分类处理。比如键盘按键消息等等。对于这类情况,我们的窗体需要继承IMessageFilterUI类,重载LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)函数,同时在窗体OnCreate创建的时候添加m_pm_.AddPreMessageFilter(this)消息通知即可。

duilib中 窗口消息处理 常用小知识 其实不限于duilib, 也适用于其它框架 目录 一、消息处理小知识点 1、判断那个按键按下 2、获取光标位置 3、在消息LPARAM lParam 参数中获得坐标位置 4、将标题栏设置为 不可移动 5、SW_SHOWNORMAL 会导致最大化窗口还原 6、WM_KEYDON 按键消息 7、当前光标位置 8、最大化 与还原是 按钮样式 9、WM_MOVE 10、右键弹出菜单 一、消息处理小知识点 1、判断那个按键按下 lParam & KEY_DOWN(VK... 阅读详情

相关推荐

海康威视工业相机网络配置实战:从MVS软件操作到IP地址规划

本文详细介绍了海康威视工业相机的网络配置实战,从MVS软件操作到IP地址规划。重点讲解了IP设置的重要性、Windows系统下的网络配置步骤、避免IP冲突的技巧,以及MVS软件中的相机IP配置方法。帮助用户快速掌握工业相机的网络连接技术,确保稳定高效的图像采集。

weixin_30296405的博客 484

Duilib学习笔记《05》— 消息响应处理

在Duilib学习笔记《04》中已经知道了如何将窗体显示出来,而如何处理窗体上的事件、消息呢? 一. 系统消息 窗体显示的时候我们就已经说了,窗体是继承CWindowWnd类的,对于窗体的部分消息的处理,需要

WHO1753 1108

Vivado IP核与约束文件管理指南:解决OOC警告、COE文件丢失与Block Design复用

本文详细介绍了Vivado IP核与约束文件管理的系统化方法,包括解决OOC警告、COE文件丢失与Block Design复用等常见问题。通过IP核锁定机制、分层约束架构和动态约束技术,提升FPGA工程的健壮性和团队协作效率,特别适合中大型项目开发。

weixin_30887919的博客 429

常用的DuiLib的消息类型

还提供了更多的消息类型,可以根据具体需求选择和使用。消息类型示例,实际上。

森明帮大于黑虎帮的博客 860

告别MATLAB依赖:手把手教你用Python实现GCC-PHAT时延估计(附完整代码与对比测试)

本文详细介绍了如何使用Python实现GCC-PHAT时延估计算法,替代传统的MATLAB依赖。通过完整的代码示例和性能对比测试,展示了Python在信号处理领域的强大能力,特别是在广义互相关和TDOA应用中的高效实现。文章还提供了实时音频处理和嵌入式部署的实用技巧,帮助工程师快速掌握这一关键技术。

weixin_42667269的博客 220

A Mathematical Framework for Transformer Circuits—(二)

transformer数学理论框架

qq_42208244的博客 757

DuiLib事件分析(一)——鼠标事件响应

DuiLib事件分析(一)——鼠标事件响应 2014-08-20 18:01 by 冷水菜, ... 阅读, ... 评论, 收藏, 编辑 最近在处理DuiLib中自定义列表行元素事件,因为处理方案得不到较好的效果,于是只好一层一层的去剥离DuiLib事件是怎么来的,看能否在某一层截取消息,自己重写。 我这里使用CListCont...

chduguxue的专栏 2076

DM-VIO论文精读:从‘延迟边缘化’到‘位姿图BA’,手把手拆解单目VIO性能超越双目的秘密

本文深入解析DM-VIO技术如何通过延迟边缘化和位姿图BA创新,解决单目视觉惯性里程计(VIO)的尺度不可观性问题,并在精度上超越传统双目系统。文章详细介绍了延迟边缘化的双因子图结构设计、位姿图BA的多级初始化策略,以及系统级优化带来的性能提升,为VIO研究与实践提供了重要参考。

weixin_30616969的博客 427

DuiLib学习-DuiLib中的通知事件

DuiLib中的通知事件 CTabLayoutUI   tabselect 调用SelectItem选择了某一项时通知。 CActiveXUI showactivex          创建完成后,显示时通知。 CCombUI                            itemselect 调用SelectIt

ORC-Lee的博客 1966

MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(KEPserverOPC通信应用)

SMART PLC 向导PID的详细介绍请查看下面文章链接:S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-优快云博客文章浏览阅读1k次。这篇博客主要介绍SMART PLC PID向导的使用,PID控制相关的其它内容请查看专栏系列文章,常用链接如下:SMART PLC PID负压控制(过程量为负数)_负压控制pid控制程序_RXXW_Dor的博客-优快云博客1、如何实现PID反作用调节?S7-1200PLC和KEPserver OPC通信-优快云博客。

RXXW_Dor的博客 1781

YOLOv8改进 | 融合篇,YOLOv8改进主干网络为MobileNetV4+CBAM注意机制+Powerful-IoU损失函数(2024 最新IOU),全网首发,实现极限涨点

本文将在 YOLOv8 主干中引入 MobileNetV4 轻量化骨干,同时,在检测头引入 CBAM机制注意力机制,并采用 Powerful-IoU 损失函数作为模型的损失函数,其中,MobileNetV4 通过引入通用反向瓶颈(UIB)搜索块和 Mobie MQA 注意力模块创新设计,实现了模型的轻量级化;同时,MobileNetV4 采用了优化的 NAS 策略,通过粗粒度和细粒度搜索相结合的方法,显著提高了搜索效率并改善了模型质量。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3783

DuiLib帮助文档篇之四通知事件

CTabLayoutUI               tabselect              调用SelectItem选择了某一项时通知。 CActiveXUI                    showactivex         创建完成后,显示时通知。 CCombUI                       itemselect            调用Sele

程序猿GTC 3701

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

DuiLib消息处理剖析

转载链接:https://www.zhaokeli.com/article/8480.html DuiLib核心的大体结构图如下: 分为几个大部分: 控件 容器(本质也是控件) UI构建解析器(XML解析) 窗体管理器(消息循环,消息映射,消息处理,窗口管理等) 渲染引擎 DuiLib 消息循环剖析 DuiLib的消息循环非常灵活,但不熟...

beibaoke910的专栏 431

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Duilib消息处理流程图解

要想熟练运用Duilib,熟悉他的消息处理机制是必须的。 网上找了一篇Duilib消息处理剖析,http://blog.youkuaiyun.com/rankun1/article/details/54099395 总结的很详细,这里进行梳理了一下,整理了一份不是很规范的流程图,以备忘 DuiLib的消息渠,也就是所谓的消息循环在CPaintManagerUI::MessageLoop()或者CWi

Barry的博客 2795

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

duilib : 消息处理 tips

在duilib中的消息处理,分为系统消息处理和窗口消息处理. 如果

博客标题不能为空 2406

Duilib 源码分析(二)消息处理

入口函数是_tWinMain int APIENTRY _tWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) { // 绘制管理器CPaintManagerUI绑定窗口句柄 CPaintManagerUI::SetInstance(hInstance); // 绘制管理器CPaintManag

weixin_42194433的博客 567

DUILIB消息处理过程

DUILIB消息处理机制 方法一、 首先窗口基类创建 CWindowWnd->Create() 调用 CWindowWnd->RegisterWindowClass() 注册 CWindowWnd->__WndProc() 为本界面窗口消息处理函数 __WndProc()调用 虚函数 CWindowWnd->HandleMessage() 处理消息 WinImp...

weixin_30756499的博客 329

DuiLib介绍及其消息处理剖析

DirectUI技术 DirectUI意为直接在父窗口上绘图(Paint on parent dc directly)。即子窗口不以窗口句柄的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上。微软的"DirectUI"技术广 泛的应用于Windows XP,Vista,Windows 7,如浏览器左侧的TaskPanel,控制面板导航界面,Media Player播放器,

5795
上一篇: 百度天气API详解
下一篇: Win32网络操作
小人物2014
博客等级 码龄19年 66粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值