我正在编写一个 CFrameWnd 包装器,我在头文件中有这一行:
#define WM_CFW_MESSAGE (WM_APP + 100)
这是一个好习惯吗?是否要求此包装器的用户必须记住不要使用此特定数字 (WM_APP + 100) ?
我正在编写一个 CFrameWnd 包装器,我在头文件中有这一行:
#define WM_CFW_MESSAGE (WM_APP + 100)
这是一个好习惯吗?是否要求此包装器的用户必须记住不要使用此特定数字 (WM_APP + 100) ?
不,这不是一个好习惯。WM_USER
范围更合适。该WM_APP
范围适用于必须由单个程序中的多个窗口类理解的消息。该WM_USER
范围适用于用于单个窗口类的消息。
因此,您可以安全地使用WM_USER
范围内的值。您可以编写#define WM_CFW_MESSAGE (WM_USER+0)
,因为您知道您的窗口类没有其他WM_USER
消息。当您向同一个窗口类添加第二条自定义消息时,您可以使用(WM_USER+1)
,等等。如果你实现另一个窗口类,它可以重新开始WM_USER+0
。
如果用户试图将该消息发送到您的包装器的窗口句柄,这只会是一个问题。
“这个包装器的用户必须记住不要使用这个特定的数字”以及他们为什么要这样做。作为组件编写者,您不应该提供方法,而不是让您的用户直接访问您的控件。
这是您可能想知道的“不成文”规则。WM_USER。在您的控制范围内使用此消息。假设您编写了一个控件,并且您的控件内部的一些方法需要更改您的控件,您可能想要使用 WM_USER。
WM_APP。如果您的应用程序需要向 OBJECTS INSIDE YOU APPLICATION 发送消息,您可以使用 WM_APP。
RegisterWindowMessage 如果您有两个(多于一个)需要相互通信的应用程序,您应该使用 RegisterWindowMessage 注册您的 WINDOWS 消息。
例子。本例使用德尔福
{ 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 }