2010-12-16 1 views
3

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

#define WM_CFW_MESSAGE    (WM_APP + 100) 

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

+0

Если вы беспокоитесь об этом, один из вариантов заключается в использовании зарегистрированных сообщений Windows, которые гарантированно уникальны для разных строк. http://msdn.microsoft.com/en-us/library/ms644947(v=vs.85).aspx – 2010-12-16 13:33:34

ответ

3

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

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

+0

Официальное слово здесь: http://msdn.microsoft.com/en-us/library/0812b0wa .aspx – 2010-12-16 16:18:49

0

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

0

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

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

WM_APP. Если ваше приложение должно отправить сообщение OBJECTS INSIDE YOU APPLICATION, вы можете использовать WM_APP.

РегистрацияWindowMessage Если у вас есть два (более одного) приложения, которые должны связываться друг с другом, вы должны ЗАРЕГИСТРИРОВАТЬ СООБЩЕНИЕ 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 }