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

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

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

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

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

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам