C++ 如何避免WM_应用程序
我正在编写一个CFrameWnd包装,头文件中有一行:C++ 如何避免WM_应用程序,c++,wrapper,windows-messages,C++,Wrapper,Windows Messages,我正在编写一个CFrameWnd包装,头文件中有一行: #define WM_CFW_MESSAGE (WM_APP + 100) 这是一种好的做法吗?是否要求此包装的用户必须记住不要使用此特定号码(WM_APP+100)?只有当用户试图将该消息发送到包装的窗口句柄时才会出现问题。不,这不是一个好的做法。WM_用户范围更合适。WM_APP范围适用于必须由单个程序中的多个窗口类理解的消息。WM_USER范围适用于针对单个窗口类的消息 因此,您可以安全地使用WM_USER
#define WM_CFW_MESSAGE (WM_APP + 100)
这是一种好的做法吗?是否要求此包装的用户必须记住不要使用此特定号码(WM_APP+100)?只有当用户试图将该消息发送到包装的窗口句柄时才会出现问题。不,这不是一个好的做法。
WM_用户
范围更合适。WM_APP
范围适用于必须由单个程序中的多个窗口类理解的消息。WM_USER
范围适用于针对单个窗口类的消息
因此,您可以安全地使用WM_USER
范围内的值。您可以编写#define WM_CFW_MESSAGE(WM_USER+0)
,因为您知道您的窗口类没有其他WM_USER
消息。向同一窗口类添加第二条自定义消息时,可以使用(WM_USER+1)
,等等。如果实现了另一个窗口类,它可以再次从WM_USER+0
开始。“此包装器的用户必须记住不要使用此特定编号”
他们为什么要这么做。作为组件编写器,您不应该提供方法,而不是让您的用户直接访问您的控件吗
这是一条你可能想知道的“不成文”规则。
WM_用户。
在您的控制范围内使用此消息。
假设您编写了一个控件,并且控件中的某些方法需要更改控件,您可能希望使用WM_USER
WM_应用程序。
如果应用程序需要向应用程序内的对象发送消息,则可以使用WM_应用程序
注册窗口消息
如果有两个(多于一个)应用程序需要相互通信,则应使用RegisterWindowMessage注册WINDOWS消息
例子。本例使用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 }
如果您担心这个问题,一种替代方法是使用已注册的Windows消息,这些消息对于不同的字符串保证是唯一的。