关于MFC对话框的OnOK调用与不调用的现象

MFC中OnOK
一个新建的MFC项目,运行起来后,点击回车,相当于按下OnOK,程序退出。这符合微软的标准GUI程序。回车键按钮默认调用了OnOK(),Esc键按钮默认调用了OnCancel()。

OnOK不调用的情况
1. 重载了 virtual BOOL PreTranslateMessage(MSG* pMsg),在函数中截了WM_KEYDOWN,当按键为VK_RETURN时,则返回TRUE。
代码如下:

复制代码
1 if ((pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_SYSKEYDOWN))
2 {
3     if (pMsg->wParam == VK_RETURN)
4     {
5         DoSomething();
6         return TRUE;
7     }
8 }
9 return CDialogEx::PreTranslateMessage(pMsg); 
复制代码

 

2. 重载了 virtual BOOL PreTranslateMessage(MSG* pMsg),在函数中截了WM_KEYDOWN,当按键为VK_RETURN时,新建了一线程,该线程影响了OnOK消息的发送。
代码如下:

if ((pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_SYSKEYDOWN))
{
    if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_SPACE)
    {
        DoSomething();
    }
}
return CDialogEx::PreTranslateMessage(pMsg);    

 

按钮代码如下:

复制代码
void CSampleDlg::DoSomething()
{
    // TODO: 在此添加控件通知处理程序代码
    if (pThread == NULL)
    {
        pThread = AfxBeginThread(ThreadProc, this);
    }
    else
    {
        // 提示:执行中,请稍后
    }
}
复制代码

 

分析原因:

根据现象提出猜测,当DoSomething()函数中开新线程处理时,OnOk则不再响应,原因可能是不能通过当前线程找到实际窗口主线程的句柄,那么发送不送不了消息到主线程,那么主线程收不到相应消息。待验证。

posted @   明月忧忧  阅读(414)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
历史上的今天:
2014-01-10 属性的字符串表示形式“<%=Value %>"创建“System.Int32”类型的对象。
点击右上角即可分享
微信分享提示