在duilib中的消息处理,分为系统消息处理和窗口消息处理.
如果消息处理放错了地方,就接收不到WM_DESTORY或WM_CLOSE的消息,从而无法处理.
duilib中的提供的消息处理函数名字好怪啊..., 必须要做注释才能不忘记, 我决定将消息处理函数的名字改了.
改成 sysMessageProc 和 WndMessageProc.
/// HandleMessage 是 CWindowWnd::__WndProc 来的消息
/// 我将 改名 HandleMessage => WndMessageProc
LRESULT CMyDlg::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRc = 0;
if (WM_DESTROY == uMsg)
{
::KillTimer(this->GetHWND(), TIMER_SN_PLAY);
}
else if (WM_RE_LAYOUT_DLG == uMsg)
{
Layout();
}
lRc = __super::HandleMessage(uMsg, wParam, lParam);
return lRc;
}
// MessageHandler 处理的是 ::GetMessage 来的消息
/// 我将 改名 MessageHandler => SysMessageProc
LRESULT CMyDlg::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
{
switch (uMsg)
{
case WM_CLOSE:
{
m_pOwner->RemoveFloatMsg(this);
}
break;
case WM_TIMER:
{
if (TIMER_SN_PLAY == wParam)
{
m_nTimeToLeve += TIMER_DELAY_PLAY;
if (m_nTimeToLeve > m_nTimeToLeveMax)
{
PostMessageW(WM_CLOSE, 0, 0);
return S_FALSE;
}
}
}
break;
default:
break;
}
return __super::MessageHandler(uMsg, wParam, lParam, bHandled);
}
通过试验可以看出,
系统消息包括 : WM_CLOSE, WM_TIMER
窗口消息包括: WM_DESTROY, 用户自定义消息.