標準のスーパークラスのカスタムWindowsコントロールがあります。カスタムコントロールが親ウィンドウに特定のイベントを通知するようにしたいと思います。そうするベストプラクティスは何ですか?親ウィンドウをカスタマイズされたコントロールから通知するための好ましい方法は何ですか?
親ウィンドウに
WM_USER
またはWM_APP
範囲内のウィンドウメッセージを送信します。別の子コントロールが同じことを試みた場合、値が衝突する可能性があるため、これは機能しません。親ウィンドウを送信
WM_NOTIFY
。これは正しいことですが、標準のWindowsコントロールを拡張しているので、私が使用する通知コードが(現在または将来の)基底クラスによって通常送信される通知コードと衝突しないようにするにはどうすればよいですか?親ウィンドウにウィンドウメッセージを
RegisterWindowMessage
から送信します。これは、意図しない衝突を回避するのに十分なはずですが、プロセス間メッセージに対してのみ使用することをお勧めします。コントロールに、通知に使用するメッセージを指定するメカニズムをアプリケーションに提供します。これは唯一のロバストなアプローチのように思われますが、それはやはり過労のように感じます。 (または、代わりにウィンドウメッセージを指定するので、私は、アプリケーションが関数ポインタを下に渡すことができることとします。)
私はa similar questionを見てきましたが、そこMFCに縛ら本当にないされ、唯一の答え衝突を回避するアドレス。
他の人は通常何をしていますか?彼らは最初の3つのアプローチのうちの1つを使用し、それについて心配していませんか?自分のコントロールがアプリケーション外でのより広い消費に適しているようにしたいので、標準のWin32を使うことも好きです。
編集:私が探しているものを明確にしようとしました。
あなたはサブクラスを意味するのですか?またはATLを使用していますか?どのようなメッセージを転送したいのですが、なぜですか? –
@MikeKwan:スーパークラスまたはサブクラス、それは本当に問題ではありません。しかし、この質問の目的のために、私がスーパークラス化していると仮定することができます(つまり、新しいウィンドウクラスを登録する)。そして、純粋なWin32を使用していると仮定して、C++やATL/WTLを使用しないでください。 – jamesdlin
すべてのクラスライブラリは、元のコントロールにメッセージを戻すことによって、Borken Cメッセージングモデルを修正するように努めています。したがって、コントロールインスタンスに固有のメッセージハンドラで処理できます。C++基本クラスによって実装された共通の動作で、クライアントコードの派生を許可することで動作をカスタマイズしました。ここで古い方法を追求する理由はありませんが、単にメッセージを親に送信しないほうが簡単です。そしてあいまいさの問題を自動的に解決します。 –