首页 > 其他分享 >关于MFC对话框的OnOK调用与不调用的现象

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

时间:2023-01-10 10:36:00浏览次数:46  
标签:调用 DoSomething 对话框 WM VK pMsg 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则不再响应,原因可能是不能通过当前线程找到实际窗口主线程的句柄,那么发送不送不了消息到主线程,那么主线程收不到相应消息。待验证。

标签:调用,DoSomething,对话框,WM,VK,pMsg,MFC,OnOK
From: https://www.cnblogs.com/freemindblog/p/17039361.html

相关文章