![]() |
|
![]() ![]() ![]() |
|
ksili |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Мне надо, чтобы при открытии диалога выполнялись некоторые действия.
Я добавил для него обработчики события OnActivate и OnShowWindow, поставил в них брекпойнты, они активны. Но при открытии диалога управление ни в один из этих обработчиков не попадает. Однако в OnShowWindow управление попадает, когда я после открытия этого диалога открываю какой-нибудь другой диалог. В чем может быть дело? Вот кратко код: *.h
*.cpp
Добавлено через 9 минут и 6 секунд А сейчас управление в OnShowWindow поймалось, когда нажал на одну из кнопок в диалоге. Думаю OnShowWindow вообще не надо использовать - для моего случая она не подходит. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||
|
|||||
voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
OnInitDialog не подходит?
|
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
А когда оно срабатывает? Сейчас OnSetFocus попробую. Если не подойдет, попробую OnInitDialog Добавлено через 12 минут и 49 секунд OnSetFocus тоже не сработал. Я бы рад использовать OnInitDialog, но не пойму как. Сообщения WM_INITDIALOG я не нашёл, есть только WM_INITMENU и WM_INITMENUPOPUP. Я посмотрел другой диалог, где уже есть такая функция, но не врубился - есть объявление и определение этой функции, но нигде нет ее вызова. В карте сообщений она тоже не прописана. При этом я проверил: управление в нее попадает только при создании приложения, а не при открытии этого диалога. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Срабатывает после создания диалога, перед его отображением. Но только 1 раз, если тебе нужно выполнять действия после сварачивания/разварачивания диалога или еще как, то не подойдет.
|
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 12 Всего: 26 |
ksili, что-то не понятно, что тебе конкретно надо?
-------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Без всякого ожидания, без нажатия каких-либо кнопок. Сразу. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 12 Всего: 26 |
ksili, Открытие это когда ты собираешься его показать?
И каждый раз при показе ты хочешь что-то делать? Ну ты-же его как-то показываешь? Вот и делай что нибудь перед тем как показываешь. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
OnInitDialog - это виртуальная функция, нужно ее просто переопределить.
Не знаю, где искал WM_INITDIALOG, если не нашел... видимо в предложениях мастера... ![]() НО: OnInitDialog приходит, когда диалог еще не виден! Если тебя это устраивает, то нормально. А если нет - тогда лови первый WM_KICKIDLE (если диалог модальный). Это спец сообщение MFC (нужно подключить afxpriv.h) которое приходит каждый раз, когда модальный диалог входит в цикл простоя; в первый раз оно приходит после завершения всех инициализаций и отображения диалога. -------------------- ... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Это диалог проверки обновлений.
Когда он открывается программа проверяет наличие обновлений, в это время отображается надпись Checking for updates... Затем, в зависимости от результатов проверки, могут отображаться разные надписи, а первая надпись исчезает. Т.е. делать это надо не до открытия диалога, а сразу после того, как он отобразился на экране. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 12 Всего: 26 |
Попробуй может поможет. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Тоже не помогло.
В который раз убеждаюсь, что слово vusual в названии студии это просто замануха. Почти ничего в ней визуального нету, все руками делать. В Билдере бы проблемы данного топика вообще не возникло - заполнил обработчик формы OnShow, и все. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не руками, а головой.
Так в чем проблема, программируй в Борланде. А visual означает всего лишь, что сразу видно кто есть кто... ![]() -------------------- ... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
это зависит не от меня в данном случае Интересно, в MSDN отдельной статьи про это сообщение нету. Оно только упоминается в статье про CWnd::RunModalLoop. Но из нее непонятно когда оно приходит Из ваших слов, Earnest, я понял, что оно будет приходить не только при открытии диалога, а еще и когда он просто открыт, и какое-то время ничего не происходит. Так? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Да, оно приходит каждый раз после опустошения очереди событий. Сразу, а не через некоторое время.
-------------------- ... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Но ведь это же не то, что мне нужно. Мне нужно один раз после открытия диалога (после того как он отобразился на экране)
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А флаг поставить, а потом сбросить? В чем проблема-то!
-------------------- ... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Никаких проблем.
Я пытался найти простейшее решение для банальной задачи, а в результате получил предложение использовать какое-то нестандартное сообщение, для которого ещё нужно что-то подключать, и дополнительный флаг. WM_SHOWWINDOW, которое бы было здесь наиболее логично, вообще срабатывает тогда, когда окно скрывается, а не появляется. Я в шоке. Вроде бы visual studio, вроде бы MFC, а не голый C++... а все приходится делать через одно место. Добавлено через 3 минуты и 1 секунду кстати а когда его сбрасывать? надо будет ловить момент закрытия диалога? Т.е. использовать что-то типа WM_CLOSE, который конечно же не будет срабатывать когда надо... ах да! у нас же есть на этот случай WM_SHOWWINDOW! гениально Это сообщение отредактировал(а) ksili - 13.2.2009, 10:37 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
ksili, не кипятись. прежде, чем биться в истерике, немешало бы разобраться. а претензии типа - "здесь не так как я привык", не обоснованы.
Во-первых, WM_SHOWWINDOW приходит и когда окно показывается и когда окно прячется
OnShowWindow(BOOL bShow, UINT nStatus) а в обработчике первый параметр как раз и указывает почему в данный момент пришло сообщение. Во-вторых, OnInitDialog вполне заменяет OnShow в делфи. А то что ты его не нашел среди сообщений в визарде, так это потому что не там искал. OnInitDialog это виртуальная функция, а не сообщение. Проблема в другом. Ты хочешь чтобы окно открылось, чтото написало, затем занялось своей работой, а потом поменяло надпись. Для этого либо нужно проверять обновления в отдельном потоке, либо сделать как говорила Earnest. В первом случае окно будет реагировать на другие сообщения, в том числе и на нажатие по кнопке ОТМЕНА, а во втором - нет. Выбирай что больше подходит. Кстати, я совсем не уверен, что если это все сделать на делфи в OnShow, то будет работать так, как ты хочешь. ksili, при создании диалога взводишь флаг, при обработке WM_KICKIDLE проверяешь флаг и если он взведен, то выполняешь свои действия, а затем сбрасываешь флаг. При всех последующих обработках WM_KICKIDLE твои действия выполняться не будут, так как флаг уже сброшен. |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Я пробовал OnInitDialog. Срабатывает один раз при создании приложения.
OnShowWindow разумеется тоже пробовал. Когда оно срабатывает, я уже писал. так будет срабатывать только при первом открытии диалога. А мне надо при каждом -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Так ты что, глобальный флаг собрался поставить? В классе диалога ставь. А диалоги обычно убивают после завершения DoModal. Кстати, он у тебя модальный? И совершенно непонятно, чего это у тебя не приходит ShowWindow на открытие окна. Прекрасно оно приходит... скорее всего, что-то неправильно сделал с обработчиком... -------------------- ... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Наконец-то разобрался!
Диалог активируется функцией SetWindowPos, а не ShowWindow. Поэтому WM_SHOWWINDOW не приходит, вместо него надо ловить WM_WINDOWPOSCHANGED. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |