基于消息,事件驱动的点滴感悟

来源:互联网 发布: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_btnMaxm_btnRestore切换显示隐藏。

bool CChatDlgWnd::OnBnClickedMax( TNotifyUI& msg ){SendMessage( WM_SYSCOMMAND, SC_MAXIMIZE, 0 );// m_btnMax->SetVisible( false );// m_btnRestore->SetVisible( true );}

这个案例很细微,但是在一定程度上却反应了一些问题,在WINDOWS平台下,依据其自身的规则,基于消息去编程,往往代码更简练高效得多,维护成本也低。可能在社会生存也是如此,顺势而为,更容易成功。




0 0