Добавление событий click / double-click к элементам управления статическим групповым блоком - PullRequest
2 голосов
/ 30 марта 2010

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

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

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

Примечание. Я прочитал http://www.codeproject.com/KB/static/staticctrl_tut.aspx и попытался ответить как на события ON_STN _..., так и на сообщения ON_BN _..., установив стиль уведомления (BS_NOTIFY отображается в файле rc) ... и до сих пор Я что-то упустил - что это? Это вообще возможно? Большинство из того, что я гуглил, предполагает, что это ... но без четких ответов для C ++ / MFC.

С момента первой публикации этого вопроса я обнаружил ссылку на сообщение WM_NCHITTEST и намекает на то, что вам нужно создать обработчик для этого сообщения, чтобы переопределить поведение по умолчанию для группового блока при ответе с HT_TRANSPARENT ... несмотря на наличие его прозрачного свойства в ClassWizard установлено значение false. Хммм. Кто-нибудь может подтвердить, что это действительно ключ?

1 Ответ

1 голос
/ 03 апреля 2011

Я думаю, что WM_NCHHITTEST / HT_TRANSPARENT действительно ключ здесь.

Групповые блоки являются странным видом элементов управления: хотя они и выглядят так, как будто они содержат другие элементы управления, на самом деле они являются элементами этих элементов управления в дереве HWND. Таким образом, групповое окно, которое выглядит так, как будто оно содержит две кнопки, на самом деле является родственным элементом этих кнопок - и может располагаться до или после него в иерархии HWND.

Групповые блоки отвечают на WM_NCHITTEST с HT_TRANSPARENT, так что щелчки мыши проходят прямо через них. Одним из преимуществ этого является то, что не имеет значения, будет ли групповой блок находиться перед или после элементов управления, которые, по-видимому, содержатся в порядке окна; клики будут перенаправлены на эти элементы управления, а не на групповую коробку.

Чтобы двойной щелчок (или простой щелчок) по групповому блоку заработал, вам нужно сделать две вещи:

  • переопределить стандартное поведение WM_NCHITTEST и вместо этого вернуть HT_CLIENT, как обычный элемент управления
  • гарантирует, что содержимое группового блока будет * предшествовать * ему в z-порядке HWND, чтобы они больше не зависели от кликов, проходящих «через» групповой блок. (По крайней мере, я думаю, что вы хотите, чтобы они были раньше; в любом случае, вам, возможно, придется поиграть с заказом HWND сейчас, когда он снова важен.)

Обратите внимание, что этот тип прозрачности снова отличается от WS_EX_TRANSPARENT, который может соответствовать свойству мастера прозрачных классов. Упрощенно говоря, HT_TRANSPARENT связан с прозрачностью для мыши; WS_EX_TRANSPARENT больше подходит для того, чтобы рисовать в последний раз, чтобы братья и сестры "просвечивали".

...