Как определить, когда изменяется состояние дочернего окна в WTL?

#c #winapi #wtl

#c #winapi #wtl

Вопрос:

Я написал простой графический интерфейс с использованием WTL:

средство удаления центра безопасности

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

Отправляют ли эти дочерние окна сообщение в главное окно, уведомляющее об изменении состояния, и согласуется ли это уведомление в целом между типами дочерних окон?

Комментарии:

1. Если вы программируете на WTL, ваш лучший друг — Spy . Запомните это! 🙂 (это инструмент, который включен в Visual Studio. Я думаю, он не установлен в «стандартной» установке)

2. @xanatos: Что мне с этим ДЕЛАТЬ? : P

3. Вы запускаете его 🙂 Вы запускаете приложение, за которым хотите следить. Вы делаете Window-> Обновить, чтобы быть уверенным. Spy-> Регистрировать сообщения, вы используете инструмент Finder, чтобы «найти» свое окно (обычно вы выбираете родительский элемент вашего элемента управления), вы начинаете с выбора всех сообщений на вкладке Сообщения и нажимаете Ok. Затем вы увидите, что оно захватывает 1 миллион бесполезных сообщений, и вы начинаете их отключать (WM_MOUSEMOVE, WM_MOUSELEAVE …) (вы можете щелкнуть правой кнопкой мыши по сообщению и выбрать Остановить протоколирование сообщения). Вы откроете для себя мир, стоящий за «старыми» элементами управления Winapi. Элементы управления WPF / Silverlight — это другой мир.

4. Другая возможность (обычно лучше). Вы начинаете в окне «window». Окно-> Обновить. Вы используете кнопку Найти окно. Вы находите элемент управления своим окном. ОК. В инспекторе свойств вы нажимаете Синхронизировать. Теперь элемент управления «выбран» в окне Window. Оттуда вы можете найти его родителей / дочерних элементов / братьев и сестер, щелкнуть правой кнопкой мыши на одном из них, Сообщения.

Ответ №1:

Дочерние уведомления обычно отправляются в родительское окно в виде WM_NOTIFY WM_COMMAND сообщений или.

Некоторые дочерние уведомления являются общими для большинства типов элементов управления (например NM_CLICK , и NM_CUSTOMDRAW ), но в целом вам нужно посмотреть ссылку на уведомления для каждого типа элемента управления в MSDN, чтобы увидеть, что доступно. Для начала ссылка на уведомления listview находится здесь, а уведомления о кнопках — здесь.

Комментарии:

1. Не повсеместно. Некоторые уведомления (в основном старые) отправляются через WM_COMMAND .

2. @Billy: Стандартный элемент управления listview поддерживает флажки с помощью LVS_EX_CHECKBOXES расширенного стиля. Я не смотрел на исходный код WTL, но я предполагаю, что он использует указанный стиль, а не делает что-то нестандартное.

3. Я отредактировал / универсально / на / обычно /, поскольку иногда бывают исключения, такие как WM_HSCROLL .