Как избежать WM_APP - PullRequest
       12

Как избежать WM_APP

3 голосов
/ 16 декабря 2010

Я пишу оболочку CFrameWnd, и у меня есть эта строка в заголовочном файле:

#define WM_CFW_MESSAGE              (WM_APP + 100)

Это хорошая практика?Требуется ли, чтобы пользователи этой обертки помнили не использовать этот конкретный номер (WM_APP + 100)?

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Нет, это не очень хорошая практика. Диапазон WM_USER больше подходит. Диапазон WM_APP предназначен для сообщений, которые должны быть поняты несколькими классами окон в одной программе. Диапазон WM_USER предназначен для сообщений, предназначенных для одного класса окон.

Таким образом, вы можете безопасно использовать значения в диапазоне WM_USER. Вы можете написать #define WM_CFW_MESSAGE (WM_USER+0), потому что знаете, что у вашего оконного класса нет других WM_USER сообщений. Когда вы добавляете второе пользовательское сообщение в тот же класс окна, вы можете использовать (WM_USER+1) и так далее. Если вы реализуете другой класс окна, он может снова начинаться с WM_USER+0.

0 голосов
/ 06 ноября 2013

«пользователи этой оболочки должны будут помнить, что не следует использовать этот конкретный номер» И почему они хотят это делать.Если вы, как автор компонентов, не предоставляете методы, а не позволяете своему пользователю напрямую обращаться к вашему элементу управления.

Это «неписанное» правило, которое вы, возможно, захотите узнать.WM_USER.Используйте это сообщение под вашим контролем.Предполагается, что вы пишете элемент управления и некоторые методы ВНУТРИ ВАШЕГО КОНТРОЛЯ должны изменить ваш элемент управления, возможно, вы захотите использовать WM_USER.

WM_APP.Если вашему приложению необходимо отправить сообщение ОБЪЕКТАМ ВНУТРИ ВАШЕЙ ЗАЯВКИ, вы можете использовать WM_APP.

RegisterWindowMessage Если у вас есть два (более одного) приложения, которым необходимо общаться друг с другом, вы должны ЗАПИСАТЬ СООБЩЕНИЕ WINDOWS с помощью RegisterWindowMessage.

Примеры.В этом примере используется Delphi

{ WM_USER }
procedure TYourControl.RefreshColor;
begin
  SendMessage(Self.Handle,WM_USER+YourNumber,wParam,lParam);
  { Pay attention to Self.Handle, use WM_USER within YOUR CONTROL }
end;

{ WM_APP }
procedure CheckValue;
var
  IResult: Integer;
begin
  IResult:=SendMessage(OtherForm.Handle,WM_APP+YourConstant,wParam,lParam);
  { Watch OtherForm.Handle }
end;

{ RegisterWindowMessage }
procedure SendCommand(OtherAppHandle: Integer);
var
  MessageNumber: Integer;
  MessageName: ShortString;
begin
  MessageName:='YourMessageName';
  Inc(MessageName[0]);MessageName[Ord(MessageName[0])]:=#0;
  MessageNumber:=RegisterWindowMessage(@MessageName[1]);
  SendMessage(OtherAppHandle,MessageNumber,wParam,lParam);
end;

{ Hope this will help }
0 голосов
/ 16 декабря 2010

Это будет проблемой только в том случае, если пользователи попытаются отправить это сообщение в дескриптор окна вашей оболочки.

...