在入门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;
}
}
// ...
}
当时觉得在双击最大化或是还原的时候,窗口应该会收到系统发来的调整窗口位置的消息,
后用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 平台下,依据其自身的规则,基于消息去编程,往往代码更简练高效得多,维护成本也低。可能在社会生存也是如此,顺势而为,更容易成功。