3

我正在编写一个 CFrameWnd 包装器,我在头文件中有这一行:

#define WM_CFW_MESSAGE              (WM_APP + 100)

这是一个好习惯吗?是否要求此包装器的用户必须记住不要使用此特定数字 (WM_APP + 100) ?

4

3 回答 3

3

不,这不是一个好习惯。WM_USER范围更合适。该WM_APP范围适用于必须由单个程序中的多个窗口类理解的消息。该WM_USER范围适用于用于单个窗口类的消息。

因此,您可以安全地使用WM_USER范围内的值。您可以编写#define WM_CFW_MESSAGE (WM_USER+0),因为您知道您的窗口类没有其他WM_USER消息。当您向同一个窗口类添加第二条自定义消息时,您可以使用(WM_USER+1),等等。如果你实现另一个窗口类,它可以重新开始WM_USER+0

于 2010-12-16T14:19:39.103 回答
0

如果用户试图将该消息发送到您的包装器的窗口句柄,这只会是一个问题。

于 2010-12-16T13:30:17.047 回答
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 }
于 2013-11-06T06:12:51.843 回答