Отправляет email-рассылки с помощью сервиса Sendsay

За 2013-12-26

[prg] Re: win32 приложение. создание простого окна с элементами управления

Приветствую всех.

Когда я говорил об отличиях в поведении обычного и диалогового окна, то подразумевал,
что вы изучите соответствующую документацию, чтобы разобраться в этих отличиях,
а не броситесь бездумно заменять одно на другое.
Например, обратите внимание на возвращаемое значение:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645469%28v=vs.85%29.aspx

Typically, the dialog box procedure should return TRUE if it processed the message,
and FALSE if it did not. If the dialog box procedure returns FALSE,
the dialog manager performs the default dialog operation in response to the message.

Для обычного окна смысл возвращаемого значения зависит от обрабатываемого сообщения
(то есть это то значение, которое указано в документации к конкретному сообщению):
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633573%28v=vs.85%29.aspx

The return value is the result of the message processing and depends on the message
sent.

Успехов. Анатолий.

   "i_chay" 2013-12-26 01:22:23 (#2903380)

[prg] Re: win32 приложение. создание простого окна с элементами управления

Приветствую всех.

Конкретное решение было указано прямым текстом: используйте сабклассинг.
Вы должны отчётливо себе представлять, в каком из окон происходит обработка сообщения.
Каждый элемент управления -- это окно. У _каждого_ окна есть своя оконная процедура.
Сообщение WM_KEYDOWN поступает в окно, которое непосредственно содержит фокус.
Это все написано в документации (и даже по-русски)!
А теперь напишите своими словами, что происходит, когда в вашем приложении фокус
находится, например, на кнопке и вы нажимаете клавишу пробел?
Какое окно получит сообщение WM_KEYDOWN???
Если есть трудности с пониманием работы оконного интерфейса Windows, то в вашем
распоряжении, во-первых, утилита spyxx.exe (должна присутствовать, по крайней
мере, в профессиональном выпуске VisualStudio), которая позволяет перехватывать
любые сообщения любых окон; во-вторых, если работа с spyxx.exe тоже вызывает
затруднение, то у вас есть швейцарский нож под названием "скрипты JAWS", при
помощи которых можно послать любое сообщение любому окну. В качестве эксперимента
напишите скрипт, который отправит WM_KEYDOWN (0x100) вашему диалоговому окну
напрямую и ваш код обработки WM_KEYDOWN сработает.

Надо ещё понимать концептуальные вещи: диалоговые окна и элементы управления
придуманы, кроме всего прочего, и для того, чтобы разработчик приложения не занимался
непосредственной обработкой клавиатурного ввода. Необходимость обработки нажатий
отдельных клавиш в диалоговом окне или обычном окне с элементами управления означает,
что вы неправильно спроектировали интерфейс пользователя. Либо ваше приложение
настолько оригинальное, что имеющиеся элементы управления ему не подходят, тогда
вы берёте "чистое" окно и полностью реализуете обработку клавиатурного ввода
(не используя никакие элементы управления). Так делают, например, в играх.
Либо вы используете стандартные элементы управления, меню, ускорители и т.п.,
тогда при правильном их использовании у вас не возникает необходимости опускаться
до обработки клавиатурного ввода (все делает система и элементы управления).

Исключением из последнего варианта является случай, когда стандартный элемент
управления вас (как разработчика приложения) почти устраивает, но некоторые изменения
в его поведение вам хотелось бы внести. Именно для этого и предназначен сабклассинг.

Успехов. Анатолий.

   "i_chay" 2013-12-26 00:25:39 (#2903338)