Win32 приложение DialogBox: как показать текст из обратного вызова на DialogBox? - PullRequest
1 голос
/ 09 июля 2010

Я работаю над приложением на основе win32 DialogBox. Это использует DialogBox () для создания диалогового окна и имеет процедуру диалогового окна, которая делает все обычные вещи.

В диалоговом окне есть статические текстовые элементы управления, и обычно я показываю текст в них через SendDlgItemMessage () из процедуры диалогового окна.

Однако в какой-то момент DialogBox запускает длительную операцию. Эта операция имеет обратный вызов с серией сообщений о состоянии. У меня возникли проблемы с отображением этих сообщений в диалоговом окне по двум причинам:

  1. Функция обратного вызова не знает, что такое диалоговое окно HWND, потому что она вызывается из кода, который выполняет длительную операцию. Я предполагаю, что могу определить переменную HWND области действия файла и скопировать в нее диалоговое окно HWND из процедуры диалогового окна непосредственно перед тем, как начнется длительная операция. Таким образом, функция обратного вызова может иметь доступ к диалоговому окну HWND. Но это кажется ужасно глупым: есть ли более элегантный способ?

  2. Процедура диалогового окна блокируется во время длительной операции. Это не имеет значения, потому что это встроенная система. Но будет ли Windows даже отображать текст в диалоговом окне, если я выполню SendDlgItemMessage (), когда процедура диалогового окна заблокирована?

edit Я провел несколько исследований, используя SendDlgItemMessage () для отправки WM_SETTEXT в статический текстовый элемент управления в диалоговом окне. Текст отображается немедленно, даже если процедура диалогового окна заблокирована.

1 Ответ

1 голос
/ 09 июля 2010

Ну, ваш диалог HWND - это одиночка, так что это не конец света.Но да, стандартный способ сделать это - передать непрозрачный указатель на код, который выполняет работу.Например, если сравнить с аргументом lParam в EnumWindows (), обратный вызов возвращает этот указатель.

Если элемент управления перерисовывает себя немедленно, это деталь реализации.Я знаю только о прогресс-баре, делающем это.Вы можете вызвать UpdateWindow на дескрипторе диалогового окна, чтобы получить все ожидающие обновления рисования, сбрасываемые на экран.

Всеобъемлющая лучшая ловушка мыши - выполнять длинные задачи в рабочем потоке.Предотвращает отображение в Windows призрачного окна «Не отвечает», предотвращает тайм-ауты широковещательных сообщений и многочисленные потенциальные проблемы взаимоблокировок.Но это сложно сделать правильно, вы не можете обновить окно непосредственно из рабочего потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...