Добавление событий щелчка/двойного щелчка в элементы управления статическим групповым полем

StackOverflow https://stackoverflow.com/questions/2541714

Вопрос

Осознав, что мои собственные причины были слишком сомнительными, я пошел по другому пути.Но мне все равно интересно...

Из соображений ностальгии, знакомства и лени пишу 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 больше подходит для рисования последним, чтобы братья и сестры «проявлялись».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top