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

时间:2010-08-21 19:57:53

标签: c++ windows progress-bar progressdialog

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

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

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

  1. 使用CreateDialog创建对话框,修改消息处理程序以容纳指定给对话框的消息,禁用主窗口并最后创建后台线程。
  2. 在挂起的初始状态下创建后台线程,使用传递线程ID的DialogBoxParam创建对话框,并在捕获WM_INITDIALOG时恢复线程。
  3. 虽然这两个中的任何一个都可能有用(我倾向于第二个选项),但我很好奇这是否应该在Windows环境中处理进度条的方式 - 或者是否存在更精简,更聪明的方式。

1 个答案:

答案 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;
}