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メッセージがないことがわかっているので、書くことができます。同じウィンドウクラスに2番目のカスタムメッセージを追加する場合は(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。アプリケーションがアプリケーション内のオブジェクトにメッセージを送信する必要がある場合は、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 }
于 2013-11-06T06:12:51.843 に答える