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则不再响应,原因可能是不能通过当前线程找到实际窗口主线程的句柄,那么发送不送不了消息到主线程,那么主线程收不到相应消息。待验证。
标签:调用,DoSomething,对话框,WM,VK,pMsg,MFC,OnOK From: https://www.cnblogs.com/freemindblog/p/17039361.html