关于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则不再响应,原因可能是不能通过当前线程找到实际窗口主线程的句柄,那么发送不送不了消息到主线程,那么主线程收不到相应消息。待验证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
2014-01-10 属性的字符串表示形式“<%=Value %>"创建“System.Int32”类型的对象。