![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
И видим, что MessageBox возвращает то, что должен возвращать, а функция DialogBox - не то, что мы указали в EndDialog, а ноль как индикатор ошибки. GetLastError() затем выдает ERROR_INVALID_WINDOW_HANDLE. Видимо, диалоговое окно считает, что его родитель уже не существует. Почему?
Я всегда думал, что MessageBox - это обычное диалоговое окно. Если кому-то в голову пришли интересные мысли по этому поводу, прошу из праздного любопытства поделиться. Это сообщение отредактировал(а) 0x07L - 14.8.2006, 15:35 |
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Хм, DialogBox возвращает ошибку и в том случае, если хендлом ему передан ноль (нет родителя)... Что же мне делать, если при закрытии главного окна мне нужно спросить кое-что у пользователя, для чего MessageBox'а не достаточно?
|
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Ответ прост: использовать DialogBoxParam и передавать параметром указатель на переменную, куда следует записать результат. Тема закрыта. То, что не получается возвратить значение через EndDialog, оставляю на совести мелкомягких
Добавлено позже: оставляю на своей совести. Это сообщение отредактировал(а) 0x07L - 14.8.2006, 17:07 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
EndDialog - сама уничтожает окно, а ты пытаешься его еще добить в WM_CLOSE да еще и в WM_DESTROY, происходит рекурсивный вызов DestroyWindow(dialog), причем второй раз она возвращает ERROR_INVALID_WINDOW_HANDLE, потому что окно удалено первым вызовом,конечно, ошибка будет. Перенеси EndDialog куда угодно, только не там где оно щас стоит и множится.
Добавлено @ 16:23 кстати, WM_CLOSE приходит раньше WM_DESTROY, поэтому EndDialog(dialog, 1) из WM_DESTROY никогда не установит в результат единицу. Добавлено @ 16:25 убери хотя бы DestroyWindow(dialog) из WM_CLOSE, сразу увидишь, диалог вернет то, что надо -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
DestroyWindow не нужно использовать в диалогах, в принципе. На то есть EndDialog
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
WM_CLOSE я обрабатываю потому, что просто так по нажатию красной кнопки в правом верхнем углу диалогового окна WM_DESTROY не приходит. В обычном окне WM_DESTROY посылается в DefWindowProc, а здесь приходится все делать самому.
Насчет того, что EndDialog можно вызывать сразу в WM_CLOSE, я вполне согласен. Я просто так привык. А в моем главном окне я поставил WM_CLOSE, чтобы убедиться в одинаковом поведении MessageBox'а и диалога после прихода WM_CLOSE и после прихода WM_DESTROY. Вот сокращенная версия программки:
Да, все работает! Добавлено @ 17:05 Моя ошибка была в том, что я, хотя чуть ли не полгода пользуюсь функцией DestroyWindow, ни разу не прочитал ее описания в MSDN. Я почему-то вбил себе в голову, что она только и делает, что посылает WM_DESTROY. Поэтому так неуклюже ее использовал. Обещаю исправиться. GremlinProg, спасибо, что помог разобраться! Это сообщение отредактировал(а) 0x07L - 14.8.2006, 17:05 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Всегда пожалуйста, только я бы хотел пожелать не списывать неудачи на мелкомягких, потому что большинство проблем решается благодаря, а не вопреки их деяниям.
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |