Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何避免WM_应用程序_C++_Wrapper_Windows Messages - Fatal编程技术网

C++ 如何避免WM_应用程序

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

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

#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消息,这些消息对于不同的字符串保证是唯一的。