Добавление событий щелчка/двойного щелчка в элементы управления статическим групповым полем
-
23-09-2019 - |
Вопрос
Осознав, что мои собственные причины были слишком сомнительными, я пошел по другому пути.Но мне все равно интересно...
Из соображений ностальгии, знакомства и лени пишу UI с помощью MFC.По сомнительным причинам (как будто их было недостаточно) я хотел добавить событие (двойного) щелчка в групповое поле.Естественно, в групповом поле есть вещи — на самом деле он содержит еще один статический элемент, к которому я могу успешно добавить обработчик событий (двойного) щелчка.
Есть ли какая-либо причина, по которой я не могу заставить обработчик событий работать с щелчками по моему групповому окну так же, как я могу сделать это для простого текстового статического элемента?Никакое количество щелчков по элементу управления, внутри него или рядом с ним не вызывает событие.
Примечание - я прочитал http://www.codeproject.com/KB/static/staticctrl_tut.aspx и попробовал ответить как на ON_STN_...события и ON_BN_...сообщения, установка стиля уведомлений (в rc-файле появляется BS_NOTIFY)...и все же я что-то упускаю - что это?Возможно ли это вообще?Большая часть того, что я искал в Google, предполагает, что это...но без четких ответов для C++/MFC.
С момента первой публикации этого вопроса я нашел ссылку на сообщение WM_NCHITTEST и намекнул, что вам нужно создать обработчик для этого сообщения, чтобы переопределить поведение по умолчанию в групповом поле, отвечающее с помощью HT_TRANSPARENT...несмотря на то, что для его свойства прозрачности в ClassWizard установлено значение false.Хм.Может ли кто-нибудь подтвердить, что это действительно ключ?
Решение
Я думаю, что WM_NCHHITTEST/HT_TRANSPARENT действительно является здесь ключевым моментом.
Групповые поля — это странный вид управления:хотя кажется, что они содержат другие элементы управления, на самом деле они являются родственными элементами этих элементов управления в дереве HWND.Таким образом, групповой блок, который выглядит так, как будто он содержит две кнопки, на самом деле является родственным по отношению к этим кнопкам и может располагаться до или после него в иерархии HWND.
Групповые поля отвечают на WM_NCHITTEST значением HT_TRANSPARENT, так что щелчки мыши проходят сквозь них.Одним из преимуществ этого является то, что не имеет значения, находится ли групповой блок до или после элементов управления, которые он содержит в порядке окон;клики в конечном итоге будут перенаправляться на эти элементы управления, а не на групповое поле.
Чтобы двойной щелчок (или просто щелчок) по групповому окну заработал, вам нужно сделать две вещи:
- переопределить поведение WM_NCHITTEST по умолчанию и вместо этого вернуть HT_CLIENT, как обычный элемент управления ;на этом этапе он должен иметь возможность получать WM_LBUTTONDOWN и связанные с ним события, которые в противном случае были бы отправлены в другое место (в одноуровневый элемент или в сам диалог).
- убедитесь, что содержимое группового поля находится *перед* ним в z-порядке HWND, чтобы они больше не полагались на клики, проходящие «через» групповое поле.(По крайней мере, я думаю, вы хотите, чтобы они были раньше;в любом случае вам, возможно, придется поиграть с порядком HWND теперь, когда он снова важен.)
Обратите внимание, что это опять же тип прозрачности, отличный от WS_EX_TRANSPARENT, который может соответствовать свойству мастера класса Transparent.Грубо говоря, HT_TRANSPARENT означает прозрачность для мыши;WS_EX_TRANSPARENT больше подходит для рисования последним, чтобы братья и сестры «проявлялись».