2011-12-14 3 views
2

WM_NOTIFYメッセージは、インプレースの「ツールヒント」(メッセージバルーン)やその他のコントロール通知によく使用されますが、コントロールをTFrameに配置すると、WM_NOTIFYメッセージは決してこれらのコントロールでは発生しません。それらのメッセージが私のフォームにもう送信されないのはなぜですか、私はそれについて何ができますか?フォームがTFrameの子のWM_NOTIFYメッセージを受信しないのはなぜですか?

+0

問題を再現できません。ツールチップのウィンドウスタイル= 0、TToolInfo.uFlags:= TTF_IDISHWNDまたはTTF_SUBCLASS、Info.hwnd:= Form.Handle、Info.uId:= Control.Handle、フレーム自体ではなく、TTN_SHOWやTTN_POPのWM_NOTIFYを受け取ります。何か他のもの(もちろんウィンドウ制御用)。私はあなたが何か間違ってツールヒント自体を設定していると思う。 –

答えて

7

WM_NOTIFYは、コントロールの親ウィンドウに送信されます。つまり、自身の親でないTForm(または別の親)ではなく、TFrameが直接の子コントロールのメッセージを受信します。

WM_NOTIFYを直接処理しないでください。新しいWindowProcハンドラを割り当てるなどして、子コントロール自体をサブクラス化し、代わりにCN_NOTIFYメッセージを処理します。 VCLは元のWM_NOTIFYメッセージを受信し、CN_NOTIFYというメッセージを自動的にそのメッセージが所属する特定のコントロールに転送します。

WM_COMMANDCN_COMMANDとして転送されます)および他の多くの転送システムメッセージについても同様です。 Controls.pasユニットは、転送されたシステムメッセージ用に定義された利用可能なすべてのCN_...メッセージを定義します。

+0

これは、この特定の質問には適用されない一般的な回答です。ツールチップコントロールが正しく設定されている場合、*所有者*ウィンドウとのインターフェイス。個々の子コントロールではなく、通知するToolTipコントロールであるため意味があります。 –

+0

これは一般的な回答かもしれませんが、Alfa000は一般化された質問をしました。ツールチップを実際に作成して表示する方法の具体的な詳細を知らなくても、 'TForm'はツールチップの所有ウィンドウではない可能性が非常に高いので、なぜ' TForm'が 'WM_NOTIFY' 'TFrame'に置かれたコントロールのメッセージです。私の推測では、実際に 'Control.Handle'や' Control.Parent.Handle'を代わりに使用しています( 'WM_NOTIFY'は' TForm'ウィンドウに 'TForm'自体に置かれたコントロールのために送られます)。 –

+0

あなたのコメントに異論はありませんが、回答はまだ適用されません。 * WM_NOTIFYはコントロールの親ウィンドウに送信されます。*、ToolTipコントロールのウィンドウには親がありません。ポップアップウィンドウです。 –

関連する問題