2010-07-09 4 views
1

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

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

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

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

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

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

ответ

1

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

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

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

+0

Все хорошие вещи. Я иду с непрозрачным маршрутом указателя и, кажется, хорошо работаю. Точка, занятая рабочей нитью; Я бы это сделал, если бы это было «реальное» приложение, а не встроенное, где не было бы мыши или клавиатуры. –