2012-02-25 13 views
1

標準のスーパークラスのカスタムWindowsコントロールがあります。カスタムコントロールが親ウィンドウに特定のイベントを通知するようにしたいと思います。そうするベストプラクティスは何ですか?親ウィンドウをカスタマイズされたコントロールから通知するための好ましい方法は何ですか?

  • 親ウィンドウにWM_USERまたはWM_APP範囲内のウィンドウメッセージを送信します。別の子コントロールが同じことを試みた場合、値が衝突する可能性があるため、これは機能しません。

  • 親ウィンドウを送信WM_NOTIFY。これは正しいことですが、標準のWindowsコントロールを拡張しているので、私が使用する通知コードが(現在または将来の)基底クラスによって通常送信される通知コードと衝突しないようにするにはどうすればよいですか?

  • 親ウィンドウにウィンドウメッセージをRegisterWindowMessageから送信します。これは、意図しない衝突を回避するのに十分なはずですが、プロセス間メッセージに対してのみ使用することをお勧めします。

  • コントロールに、通知に使用するメッセージを指定するメカニズムをアプリケーションに提供します。これは唯一のロバストなアプローチのように思われますが、それはやはり過労のように感じます。 (または、代わりにウィンドウメッセージを指定するので、私は、アプリケーションが関数ポインタを下に渡すことができることとします。)

私はa similar questionを見てきましたが、そこMFCに縛ら本当にないされ、唯一の答え衝突を回避するアドレス。

他の人は通常何をしていますか?彼らは最初の3つのアプローチのうちの1つを使用し、それについて心配していませんか?自分のコントロールがアプリケーション外でのより広い消費に適しているようにしたいので、標準のWin32を使うことも好きです。

編集:私が探しているものを明確にしようとしました。

+0

あなたはサブクラスを意味するのですか?またはATLを使用していますか?どのようなメッセージを転送したいのですが、なぜですか? –

+0

@MikeKwan:スーパークラスまたはサブクラス、それは本当に問題ではありません。しかし、この質問の目的のために、私がスーパークラス化していると仮定することができます(つまり、新しいウィンドウクラスを登録する)。そして、純粋なWin32を使用していると仮定して、C++やATL/WTLを使用しないでください。 – jamesdlin

+0

すべてのクラスライブラリは、元のコントロールにメッセージを戻すことによって、Borken Cメッセージングモデルを修正するように努めています。したがって、コントロールインスタンスに固有のメッセージハンドラで処理できます。C++基本クラスによって実装された共通の動作で、クライアントコードの派生を許可することで動作をカスタマイズしました。ここで古い方法を追求する理由はありませんが、単にメッセージを親に送信しないほうが簡単です。そしてあいまいさの問題を自動的に解決します。 –

答えて

0

だから私はCommCtrl.hで定義された通知コードの範囲は、すべてのように見えることに気づいた:

#define NM_FIRST    (0U- 0U)  // generic to all controls 
#define NM_LAST     (0U- 99U) 
... 
#define TRBN_FIRST    (0U-1501U)  // trackbar 
#define TRBN_LAST    (0U-1519U) 

だから、マイクロソフトのコモンコントロールは、少なくとも定義された範囲を持っている(と常に大きな符号なしの値である可能性が高いです)。したがって、標準コントロールをスーパークラスまたはサブクラス化し、0からインクリメントする通知コードを使用すると、現在および将来のバージョンのWindowsに対して安全でなければならないと思います。

(私は、サードパーティ製のコントロールから派生された場合、これらのサードパーティ製のコントロールは、独自の予約範囲を定義する必要があります。そうしないと全てのベットがオフになります。)

1

既存のウィンドウクラスをスーパークラス化してその動作を強化するので、既存のメッセージとの衝突を心配するのは間違いありません。そのため、WM_APPの範囲のメッセージを使用しなければならないと感じています。 RegisterWindowMessageも同じように使うことができますが、私はそれが過度であることに同意します。

関連する問題