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

在入门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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值