我正在用C ++直接应用WINAPI编写Windows CE应用程序。在这个应用程序中,我解析了一个文本文件,该文件可能有也可能不大,因此可能需要或可能不需要一段时间来加载;因为我将添加通过无线网络加载文件的功能,我认为最好添加一个进度条。
我的目标是在模态对话框中显示进度条,从而防止用户与主窗口进行交互。然后创建一个线程以在后台执行加载,让主线程更新GUI。
但是,使用EndDialog()
会阻止我返回加载文件的代码,直到对话框关闭为止。显然我想显示对话框,然后加载加载,定期更新后台线程的进度。在这一点上,我只知道有两种方法可以避免这种情况:
CreateDialog
创建对话框,修改消息处理程序以容纳指定给对话框的消息,禁用主窗口并最后创建后台线程。
DialogBoxParam
创建对话框,并在捕获WM_INITDIALOG
时恢复线程。
虽然这两个中的任何一个都可能有用(我倾向于第二个选项),但我很好奇这是否应该在Windows环境中处理进度条的方式 - 或者是否存在更精简,更聪明的方式。
答案 0 :(得分:0)
您无需做任何特别棘手或异常的事情。只需使用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;
}