私は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
メッセージがないことがわかっているので、書くことができます。同じウィンドウクラスに2番目のカスタムメッセージを追加する場合は(WM_USER+1)
、などを使用できます。別のウィンドウクラスを実装すると、最初からWM_USER+0
やり直すことができます。
ユーザーがそのメッセージをラッパーのウィンドウハンドルに送信しようとした場合にのみ問題になります。
「このラッパーのユーザーは、この特定の番号を使用しないことを覚えておく必要があります」そして、なぜ彼らはそれをしたいのでしょうか。コンポーネントライターとして、ユーザーがコントロールに直接アクセスできるようにするのではなく、メソッドを提供するべきではありません。
これはあなたが知りたいかもしれない「不文律」です。WM_USER。コントロール内でこのメッセージを使用してください。仮に、コントロールを作成し、コントロール内のいくつかのメソッドでコントロールを変更する必要がある場合は、WM_USERを使用することをお勧めします。
WM_APP。アプリケーションがアプリケーション内のオブジェクトにメッセージを送信する必要がある場合は、WM_APPを使用できます。
RegisterWindowMessage相互に通信する必要のある2つ(複数)のアプリケーションがある場合は、RegisterWindowMessageを使用してWINDOWSMESSAGEを登録する必要があります。
例。この例では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 }