MFC捕捉子控件鼠标消息莫名奔溃

本文探讨了在PreTranslateMessage中处理鼠标消息时遇到的问题,即在消息处理过程中删除按钮导致程序崩溃的情况,并提出了解决方案,建议将删除操作放置于特定的消息处理函数中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前置条件:
窗口中有个按钮,在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消息来处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值