Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [CDialog] OnActivate и OnShowWindow не срабатывают 
V
    Опции темы
Earnest
Дата 13.2.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



А флаг поставить, а потом сбросить? В чем проблема-то!


--------------------
...
PM   Вверх
ksili
Дата 13.2.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Никаких проблем.
Я пытался найти простейшее решение для банальной задачи, а в результате получил предложение использовать какое-то нестандартное сообщение, для которого ещё нужно что-то подключать, и дополнительный флаг.

WM_SHOWWINDOW, которое бы было здесь наиболее логично, вообще срабатывает тогда, когда окно скрывается, а не появляется. Я в шоке.

Вроде бы visual studio, вроде бы MFC, а не голый C++... а все приходится делать через одно место.

Добавлено через 3 минуты и 1 секунду
Цитата(Earnest @  13.2.2009,  14:26 Найти цитируемый пост)
А флаг поставить, а потом сбросить?

кстати а когда его сбрасывать? надо будет ловить момент закрытия диалога? Т.е. использовать что-то типа WM_CLOSE, который конечно же не будет срабатывать когда надо... ах да! у нас же есть на этот случай WM_SHOWWINDOW! гениально

Это сообщение отредактировал(а) ksili - 13.2.2009, 10:37


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
voov
Дата 13.2.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



ksili, не кипятись. прежде, чем биться в истерике, немешало бы разобраться. а претензии типа - "здесь не так как я привык", не обоснованы.

Во-первых, WM_SHOWWINDOW приходит и когда окно показывается и когда окно прячется
Цитата

The WM_SHOWWINDOW message is sent to a window when the window is about to be hidden or shown

OnShowWindow(BOOL bShow, UINT nStatus)
а в обработчике первый параметр как раз и указывает почему в данный момент пришло сообщение.

Во-вторых, OnInitDialog вполне заменяет OnShow в делфи. А то что ты его не нашел среди сообщений в визарде, так это потому что не там искал. OnInitDialog это виртуальная функция, а не сообщение.

Проблема в другом. Ты хочешь чтобы окно открылось, чтото написало, затем занялось своей работой, а потом поменяло надпись. Для этого либо нужно проверять обновления в отдельном потоке, либо сделать как говорила Earnest. В первом случае окно будет реагировать на другие сообщения, в том числе и на нажатие по кнопке ОТМЕНА, а во втором - нет. Выбирай что больше подходит. Кстати, я совсем не уверен, что если это все сделать на делфи в OnShow, то будет работать так, как ты хочешь.


Цитата(Earnest @  13.2.2009,  10:26 Найти цитируемый пост)
А флаг поставить, а потом сбросить? В чем проблема-то!


Цитата(ksili @  13.2.2009,  10:36 Найти цитируемый пост)
кстати а когда его сбрасывать?


ksili, при создании диалога взводишь флаг, при обработке WM_KICKIDLE проверяешь флаг и если он взведен, то выполняешь свои действия, а затем сбрасываешь флаг. При всех последующих обработках WM_KICKIDLE твои действия выполняться не будут, так как флаг уже сброшен.

PM MAIL   Вверх
ksili
Дата 13.2.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Я пробовал OnInitDialog. Срабатывает один раз при создании приложения.

OnShowWindow разумеется тоже пробовал. Когда оно срабатывает, я уже писал.
Цитата(voov @  13.2.2009,  16:29 Найти цитируемый пост)
ksili, при создании диалога взводишь флаг, при обработке WM_KICKIDLE проверяешь флаг и если он взведен, то выполняешь свои действия, а затем сбрасываешь флаг. При всех последующих обработках WM_KICKIDLE твои действия выполняться не будут, так как флаг уже сброшен.

так будет срабатывать только при первом открытии диалога. А мне надо при каждом


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Earnest
Дата 13.2.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(ksili @  13.2.2009,  13:54 Найти цитируемый пост)
так будет срабатывать только при первом открытии диалога. А мне надо при каждом 

Так ты что, глобальный флаг собрался поставить? В классе диалога ставь. А диалоги обычно убивают после завершения DoModal. Кстати, он у тебя модальный? 

И совершенно непонятно, чего это у тебя не приходит ShowWindow на открытие окна. Прекрасно оно приходит... скорее всего, что-то неправильно сделал с обработчиком...



--------------------
...
PM   Вверх
ksili
Дата 18.2.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Наконец-то разобрался!

Диалог активируется функцией SetWindowPos, а не ShowWindow. Поэтому WM_SHOWWINDOW не приходит, вместо него надо ловить WM_WINDOWPOSCHANGED.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.