基于消息,事件驱动的点滴感悟
来源:互联网 发布:c语言 关键字 编辑:程序博客网 时间:2024/06/06 09:50
在入门windows编程时,我们总会听到这么一句:Message Based,Event Driven。
今天在解决Bug00173911 TL2.6:合并窗口,滑动鼠标使得右上角的收缩按钮展开,拖动窗口至最大化,关闭按钮显示为还原按钮 时有点感触。
在解决该bug后,调试过程中发现,窗口的最大化和还原状态与右上角的Button状态偶尔对应不上,后面跟踪发现因为win7系统有针对桌面窗口自动排列的功能,当我们拖动一个窗口移动到桌面右边边缘时,系统会将窗口自动铺满半个屏幕。而xp中没有此功能,因此我们在处理双击标题栏是否最大化/还原问题时用了以下的代码。
LRESULT CChatDlgWnd::HandleMessage( UINT message, WPARAM wParam, LPARAM lParam ){if ( message == WM_NCLBUTTONDBLCLK && wParam == HTCAPTION ){if ( m_bMaxShow ){::GetWindowRect( m_hWnd, &m_rcWnd );m_btnMax->SetVisible( true );m_btnRestore->SetVisible( false );m_bMaxShow = false;}else{::GetWindowRect( m_hWnd, &m_rcWnd );m_btnMax->SetVisible( false );m_btnRestore->SetVisible( true );m_bMaxShow = true;}}// ...}
但按以上的操作让系统对窗口进行自动排列后,此时窗口占半个屏幕大小,并非最大化状态,双击窗口的标题栏,会发现系统的行为并非是将窗口置为Max状态,还是Restored状态。
当时觉得在双击最大化或是还原的时候,窗口应该会收到系统发来的调整窗口位置的消息,
后用SPY++抓了一下窗口消息,发现在双击标题栏时会收到WM_SIZE 消息。
,wParam为相应的
#define SIZE_RESTORED 0#define SIZE_MINIMIZED 1#define SIZE_MAXIMIZED 2#define SIZE_MAXSHOW 3#define SIZE_MAXHIDE 4
因此果断用WM_SIZE替代了原先的代码。
用这样的方式同样在响应最大化/还原按钮时无需进行额外的操作将m_btnMax和m_btnRestore切换显示隐藏。bool CChatDlgWnd::OnBnClickedMax( TNotifyUI& msg ){SendMessage( WM_SYSCOMMAND, SC_MAXIMIZE, 0 );// m_btnMax->SetVisible( false );// m_btnRestore->SetVisible( true );}
这个案例很细微,但是在一定程度上却反应了一些问题,在WINDOWS平台下,依据其自身的规则,基于消息去编程,往往代码更简练高效得多,维护成本也低。可能在社会生存也是如此,顺势而为,更容易成功。
0 0
- 基于消息,事件驱动的点滴感悟
- Win32基于事件驱动的消息机制
- 大学生活的点滴感悟
- 感悟点滴
- 点滴感悟
- 点滴感悟
- 点滴感悟
- 点滴感悟
- 事件驱动VS消息驱动
- Linux基于事件驱动的程序框架
- 基于事件驱动的Oracle作业调度
- 基于事件驱动的Oracle作业调度
- 基于C++11的事件驱动框架
- node:基于事件驱动的回调
- 基于事件驱动的并发编程
- windows的所谓事件驱动核心是消息!
- CComboBox利用消息驱动SELCHANGE事件的发生
- windows 的事件驱动机制和消息循环
- 无法打开登录所请求的数据库XXX。登录失败。 用户 'NT AUTHORITY\NETWORK 登录失败
- 查看tomcat下的的日志
- Hadoop Hive 中的排序 Order by ,Sort by ,Distribute by, Cluster By,
- 解决gedit无法保存的问题
- Java中HashMap遍历的两种方式
- 基于消息,事件驱动的点滴感悟
- 推荐系统评测指标
- cmake 编译opencv 出现 The C++ compiler "C:/Program Files/Microsoft Visual Studio 10.0/VC/bin/cl.exe
- TOJ-1409 - Equations
- linux编译系统的Kconfig和Makefile
- [转]提示microsoft incremental linker已停止工作解决方法
- 基础总结篇之二:Activity的四种launchMode
- 假期观察:家乡的、身边的真实互联网
- 复习JSP基础内容