1

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

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

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

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

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

4

1 回答 1

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;
}
于 2010-08-21T21:03:20.270 回答