Что _реально_ происходит с диалогом при нажатии Enter/Esc?
От: programmater  
Дата: 06.10.10 10:46
Оценка: :)
Здравствуйте коллеги.
Наверняка многие из вас сталкивались с ситуацией, когда при нажатии на ESC в дочернем диалоге он исчезал. Т.е: есть родительский диалог. На нем создается один или несколько дочерних диалогов. Потом, когда фокус находится на одном из контролов одного из дочерних диалогов, нажать ESC, то дочерний диалог, на чьем контроле находился фокус, исчезнет. Вещь эта давно известная, и многие наверняка как-то эту проблему обходили. Я, например, всегда решал ее следующей строчкой в классе дочернего диалога:
void OnCancel() {}

При этом я был абсолютно уверен, что дочерний диалог в этот момент уничтожается, и что попытка сделать что-то с запомненным HWND этого диалога ни к чему не приведет (ведь этого WINAPI-объекта уже нет!). А вот не тут-то было. Сейчас, возясь с самодельным PropertySheet-ом (только не спрашивайте, зачем мне это надо ), обнаружил, что странички при нажатии на ESC вовсе не помирают (хотя с экрана успешно пропадают), и что при повторном переключении на эту страницу вызов
::ShowWindow(m_Pages[CurSelIndex], SW_SHOW);   // m_Pages хранит HWND!

успешно срабатывает и страничка появляется как ни в чем не бывало. Не поверил глазам, специально написал обработчик WM_DESTROY для странички (хотя на самом деле этот обработчик мне не нужен, но было уж больно интересно). Нажал на ESC. Страничка пропала. WM_DESTROY не было! Так куда же девается диалог?
Вот и возник вопрос: что же на самом деле происходит с диалогом, когда юзер нажимает на Enter/ESC?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.