Каков предпочтительный способ уведомления родительского окна из настроенного элемента управления? - PullRequest
1 голос
/ 25 февраля 2012

У меня есть пользовательские элементы управления Windows, которые превосходят стандартные. Я хотел бы, чтобы мои пользовательские элементы управления уведомляли родительское окно об определенных событиях. Какая лучшая практика для этого?

  • Отправьте родительскому окну сообщение окна в диапазоне WM_USER или WM_APP. Это не будет работать, так как значения могут столкнуться, если другой дочерний элемент управления попытается сделать то же самое.

  • Отправить родительское окно WM_NOTIFY. Это кажется правильным решением, но, поскольку я расширяю стандартный элемент управления Windows, как я могу гарантировать, что используемый мной код уведомления не будет конфликтовать с кодом, обычно отправляемым базовым классом (сейчас или в будущем)?

  • Отправьте родительскому окну сообщение окна от RegisterWindowMessage. Этого должно быть достаточно, чтобы избежать непреднамеренных коллизий, но Microsoft рекомендует использовать его только для межпроцессных сообщений.

  • У элемента управления должен быть механизм, позволяющий приложению указать, какое WM_APP сообщение использовать для уведомлений. Это кажется единственным надежным подходом, но это также похоже на излишество. (Или вместо указания оконного сообщения, я предполагаю, что приложение может передать указатель на функцию.)

Я видел похожий вопрос , но единственный ответ там связан с MFC и на самом деле не касается предотвращения столкновений.

Что обычно делают другие люди? Они используют один из первых трех подходов и не беспокоятся об этом? Мне бы хотелось, чтобы мои элементы управления подходили для более широкого потребления вне моего приложения, поэтому я также предпочел бы использовать стандартный Win32.

Редактировать: пытался уточнить, что я ищу.

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Так как вы переклассифицируете существующий класс окна и расширяете его поведение, то вы должны беспокоиться о конфликтах с существующими сообщениями. Из-за этого я чувствую, что вы должны использовать сообщение в диапазоне WM_APP. Вы также можете использовать RegisterWindowMessage, но я согласен, что это излишне.

0 голосов
/ 20 марта 2012

Итак, я заметил, что диапазоны кодов уведомлений, определенные в CommCtrl.h, выглядят так:

#define NM_FIRST                (0U-  0U)       // generic to all controls
#define NM_LAST                 (0U- 99U)
...
#define TRBN_FIRST              (0U-1501U)       // trackbar
#define TRBN_LAST               (0U-1519U)

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

(Если бы я производился от сторонних элементов управления, тоэти сторонние элементы управления должны будут определять свои собственные зарезервированные диапазоны. В противном случае все ставки будут отключены.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...