Отсутствует WM_WINDOWPOSCHANGING в диалоговом окне MFC VS 2012

Я пытаюсь реализовать Эта статья Но когда я смотрю на все сообщения, которые мой диалог имеет в представлении ресурсов (на вкладке сообщений), я не вижу этого сообщения. Любая идея, как это поймать (доступно? Это проблема IDE?) Спасибо, Дэни.


person Dani    schedule 07.09.2013    source источник
comment
Возможно, это даже не проблема IDE, а просто сообщение отсутствует в коротком списке, поэтому оно не указано в IDE. Вы можете добавить обработчик вручную, набрав код. Получает ли ваше окно конкретное сообщение или нет - вы всегда можете проверить с помощью инструмента Spy++.   -  person Roman R.    schedule 07.09.2013
comment
Я видел примечание об изменении настроек для отображения этих отсутствующих сообщений, но понятия не имею, что и когда менять: codeproject.com/Articles/1724/   -  person Dani    schedule 07.09.2013
comment
Все зависит от того, что вам нужно сделать, иногда нет необходимости ждать WM_WINDOWPOSCHANGING, и вы можете вызвать PostMessage() из своего обработчика WM_INITDIALOG (или в вашем переопределении OnInitDialog(), если вы используете MFC). Можете ли вы сделать скриншот того, что вы видите во вкладке сообщений?   -  person Edward Clements    schedule 07.09.2013
comment
Я получаю около 30 сообщений, но не то, которое мне нужно... Я добавил его вручную.   -  person Dani    schedule 08.09.2013


Ответы (1)


Мастер классов MFC не показывает сообщения, для которых обработчик сообщений уже реализован в базовом классе CWnd. Для обработки WM_WINDOWPOSCHANGING все, что вам нужно сделать, это переопределить < a href="http://msdn.microsoft.com/en-us/library/xz5c4859.aspx" rel="nofollow">CWnd::OnWindowPosChanging.

Обновление: я только что проверил, и моя установка Visual Studio 2012 (обновление 3) содержит список WM_WINDOWPOSCHANGING для класса диалога. Если он не отображается, возможно, вы выбрали не тот класс в раскрывающемся списке Имя класса.

Если сообщение не отображается для вас в мастере классов по какой-либо причине, вы все равно можете реализовать его вручную. Мастер классов — это просто удобство, а не требование. MFC реализует обработку сообщений, создавая карту сообщений, которую можно расширить, добавление обработчиков сообщений с помощью макросов схемы сообщений.

Объявите обработчик сообщений с правильной подписью и именем в своем диалоговом классе. Обратите внимание, что макрос afx_msg ничего не заменяет и служит только для документирования того, что это обработчик сообщений MFC.

afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);

Добавьте обработчик сообщений в карту сообщений вашего диалога:

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ...
    ON_WM_WINDOWPOSCHANGING()
END_MESSAGE_MAP()

Макрос для использования, а также сигнатуру и имя функции можно найти на странице WM_ Messages. : Т – Я. С этим вы можете реализовать свой обработчик сообщений:

void CMyDialog::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
    CDialogEx::OnWindowPosChanging(lpwndpos);

    // TODO: Add your message handler code here
}

Обратите внимание, что реализация мастера классов (VS 2010 и выше) больше не требует специально отформатированных комментариев в исходном коде (как это было в VS6). Добавление обработчиков сообщений вручную не нарушает функциональность мастера классов.

person IInspectable    schedule 07.09.2013
comment
Это диалог, и мне нужно что-то запустить только после того, как оно будет показано. есть несколько статей, в которых говорится об использовании этого сообщения с диалогом... - person Dani; 07.09.2013
comment
@Dani Тогда вы, вероятно, ищете WM_WINDOWPOSCHANGED. Независимо от этого убедитесь, что вы выбрали класс диалога в разделе Имя класса в правом верхнем углу мастера создания классов. - person IInspectable; 07.09.2013
comment
Хорошо, только что использовал мастер для создания WM_SHOWWINDOW, а затем изменил все, чтобы соответствовать моему сообщению. оно работает. Я не знаю, почему сообщение отсутствует на экране свойств.... - person Dani; 08.09.2013