MFC模态对话框在运行异步线程后变成了非模态对话框
时间: 2023-12-29 17:04:40 浏览: 26
在MFC中,模态对话框是通过DoModal函数来实现的,而非模态对话框则是通过Create函数创建并显示的。在运行异步线程后,如果需要在模态对话框中更新UI,就需要使用PostMessage或SendMessage函数将更新消息发送给主线程,在主线程中处理更新UI的消息。如果使用Create函数创建对话框并显示,则可以在异步线程中直接调用对话框的成员函数进行UI更新。因此,如果在使用异步线程时需要保持对话框的模态性,可以考虑使用PostMessage或SendMessage函数来更新UI,或者在异步线程中调用DoModal函数来创建并显示模态对话框。
相关问题
mfc非模态对话框创建
MFC中创建非模态对话框有几种方式。一种方式是采用局部变量创建非模态对话框。可以通过以下代码实现:
```
CTestDialog *pTD = new CTestDialog();
pTD->Create(IDD_DIALOG1); //创建一个非模态对话框
pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
```
另一种方式是直接创建非模态对话框的对象,如下所示:
```
CTestDialog td;
td.Create(IDD_DIALOG1); //创建一个非模态对话框
td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
```
还可以使用成员变量创建非模态对话框。在相应的CPP文件中,可以添加以下代码:
```
pTD = new CTestDialog(); //给指针分配内存
pTD->Create(IDD_DIALOG1); //创建一个非模态对话框
pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
```
以上是MFC中创建非模态对话框的几种方式。\[1\]\[2\]\[3\]
#### 引用[.reference_title]
- *1* *2* *3* [MFC模态对话框和非模态对话框](https://blog.csdn.net/whysnlc/article/details/6976629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
MFC 非模态对话框窗如何响应PreTranslateMessage
在 MFC 中,非模态对话框窗口需要手动响应 PreTranslateMessage 函数。你可以在非模态对话框的消息处理函数中调用 PreTranslateMessage 函数,或者在 OnCreate 函数中手动创建对话框窗口并调用 PreTranslateMessage 函数。以下是一些示例代码:
在非模态对话框的消息处理函数中调用 PreTranslateMessage 函数:
```
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_ESCAPE)
{
// 处理 ESC 键按下事件
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
```
在 OnCreate 函数中手动创建对话框窗口并调用 PreTranslateMessage 函数:
```
int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建非模态对话框窗口
if (!m_mySubDlg.Create(IDD_MY_SUBDLG, this))
return -1;
// 手动调用 PreTranslateMessage 函数
MSG msg;
while (PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE))
{
if (!m_mySubDlg.PreTranslateMessage(&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
```
需要注意的是,在非模态对话框的 PreTranslateMessage 函数中处理完消息后,需要将返回值传递给父窗口的消息处理函数,以确保消息被正确处理。