gpt4 book ai didi

c++ - 在 Windows CE 中使用模态进度条对话框?

转载 作者:太空宇宙 更新时间:2023-11-04 14:26:29 28 4
gpt4 key购买 nike

我正在使用 C++ 直接应用 WINAPI 编写 Windows CE 应用程序。在此应用程序中,我解析了一个文本文件,该文件可能很大,也可能不大,因此可能需要一些时间来加载,也可能不需要。由于我将添加通过无线网络加载文件的功能,因此我认为最好添加一个进度条。

我的目标是在模态对话框中显示进度条,从而防止用户与主窗口交互。然后创建一个线程在后台执行加载,让主线程更新 GUI。

但是,使用 EndDialog() 会阻止我返回到加载文件的代码,直到对话框关闭。显然我想显示对话框,然后然后加载负载,定期从后台线程更新进度。在这一点上,我只知道有两种方法可以避免这种情况:

  1. 使用 CreateDialog 创建对话框,修改消息处理程序以容纳指定给对话框的消息,禁用主窗口,最后创建后台线程。
  2. >在暂停的初始状态下创建后台线程,使用传递线程 ID 的 DialogBoxParam 创建对话框,并在捕获 WM_INITDIALOG 时恢复线程。

虽然这两个中的任何一个都可能有效(我倾向于第二个选项),但我很好奇这是否是应该在 Windows 环境中处理进度条的方式——或者是否有更精简、更聪明的方法。

最佳答案

您不必做任何特别棘手或不寻常的事情。只需使用 DialogBox() 创建模态对话框.在对话框过程的 WM_INITDIALOG 处理程序中,创建后台线程以加载文件。随着加载的进行,发送 PBM_SETPOS向进度条控件发送消息以更新它。

加载完成后,调用EndDialog() 关闭对话框。但是,必须从对话过程中调用 EndDialog()。为此,您需要发送一条虚拟消息(例如 WM_APP):

DialogBox(..., DlgProc);
// File loading is done and dialog box is gone now
...
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT msg, LPARAM lparam, WPARAM wparam)
{
switch(msg)
{
case WM_INITDIALOG:
CreateThread(..., LoadingThread, ...);
return TRUE;

case WM_APP:
EndDialog(hwnd);
return TRUE;
...
}

return FALSE:
}

DWORD WINAPI LoadingThread(LPVOID param)
{
// Load the file
while(!done)
{
...
SendMessage(hwndProgressBar, PBM_SETPOS, progress, 0);
}

SendMessage(hwndDialogBox, WM_APP, 0, 0);
return 0;
}

关于c++ - 在 Windows CE 中使用模态进度条对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538708/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com