前置条件:
窗口中有个按钮,在PreTranslateMessage中捕捉鼠标消息,交给窗口对应的鼠标消息进行处理。
BOOL PreTranslateMessage(MSG* pMsg)
{
// 捕获的消息坐标基于屏幕
if (pMsg->message == WM_MOUSEMOVE)
{
OnMouseMove(MK_MBUTTON, pMsg->pt);
}
else if(pMsg->message == WM_LBUTTONDOWN)
{
OnLButtonDown(MK_MBUTTON, pMsg->pt);
}
else if(pMsg->message == WM_LBUTTONUP)
{
OnLButtonUp(MK_MBUTTON, pMsg->pt);
}
return CDialog::PreTranslateMessage(pMsg);
}
然后在消息处理过程中,删除了按钮,这时程序奔溃。跟踪断点信息,发现是找不到顶级窗口,当时完全不知道什么原因。过了几天,又仔细思考了一下,发现是捕捉了按钮的鼠标消息,又在处理过程中删除了鼠标,这时消息还没结束,导致奔溃。
解决方法:把删除按钮操作放到一个消息处理函数里,在鼠标消息中Post消息来处理。