Использование модальных диалоговых окон в Windows CE? - PullRequest
1 голос
/ 21 августа 2010

Я пишу приложение Windows CE на C ++, непосредственно применяя WINAPI. В этом приложении я анализирую текстовый файл, который может быть или не быть большим и, следовательно, может или не может занять некоторое время для загрузки; и поскольку я добавлю функциональность для загрузки файлов по беспроводной сети, я решил, что было бы лучше добавить индикатор выполнения.

Моя цель состоит в том, чтобы отображать индикатор выполнения в модальном диалоговом окне, тем самым предотвращая взаимодействие пользователя с основным окном. Затем создается поток для выполнения загрузки в фоновом режиме, оставляя основной поток для обновления графического интерфейса.

Однако использование EndDialog() не позволяет мне вернуться к коду, который загружает файл, пока диалоговое окно не будет закрыто. Очевидно, я хочу показать диалоговое окно и , а затем загрузить загрузку, периодически обновляя прогресс из фонового потока. На данный момент я знаю только два варианта, чтобы обойти это:

  1. Создайте диалог, используя CreateDialog, измените обработчик сообщений, чтобы он соответствовал сообщениям, предназначенным для диалога, отключите главное окно и, наконец, создайте фоновый поток.
  2. Создайте фоновый поток в приостановленном начальном состоянии, создайте диалоговое окно, используя DialogBoxParam, передавая идентификатор потока, и при захвате WM_INITDIALOG возобновите поток.

Хотя любой из этих двух вариантов, вероятно, сработает (я склоняюсь ко второму варианту), мне любопытно, должен ли этот способ обрабатывать индикаторы выполнения в среде Windows - или если есть более тонкий и умный способ сделать это.

1 Ответ

0 голосов
/ 22 августа 2010

Вам не нужно делать ничего особенно хитрого или необычного. Просто создайте модальное диалоговое окно с 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;
}
...