2011-01-18 18 views
1

ポップアップメニューの位置を変更する方法はありますか?トップレベルウィンドウでは、CBTProcコールバック関数とMoveWindowを使用して実行できます。メニューでも同じことをすることはできますか?ポップアップメニューが親ウィンドウの領域にのみ配置されるようにする必要があります。ライトウィンドウマネージャのようなもの。Windows。ドロップダウンメニューの位置を変更する

答えて

1

はい、WH_CBTフックコールバックでは、メニューウィンドウが作成されるたびにHCBT_CREATEWNDの 'nCode'で通知されます。クラス名のテストでは、標準のメニュー/サブメニューウィンドウはクラス名が '#32768'になります。その後、ウィンドウにMN_GETHMENUメッセージを送信して、どのメニューがアクティブになるかを調べることができます。しかし、as documentedでは、通知を受信したときにウィンドウを移動するには時期尚早です。メニューはまだ表示されていないため、ウィンドウをサブクラス化して追加のメッセージを処理する必要があります。

メニューウィンドウが表示されているときに通知するためのフックを必要としないことに注意してください。WM_ENTERIDLEメッセージ用のハンドラを置くことができます。メニューがメッセージを引き起こしたかどうかを確認する 'wParam' 「lParam」のウィンドウを開き、再度「MN_GETHMENU」を送信して特定のメニューを見つけます。これ以上のメッセージ処理を行わなくても、この時点でウィンドウを移動することは可能です。 'WM_ENTERIDLE'は複数回呼び出されるので、特定のウィンドウを移動したかどうかを確認する必要があることに注意してください。

+0

ありがとう、私が必要とするものです!今私は、コンテキストメニューで同じことをしようとするが、それをキャッチする適切なウィンドウメッセージを見つけることができません。何かアドバイスできますか? – Alexander

+0

@Alexander - Delphiアプリケーションでテストされていますが、両方のメソッドが動作するようです。 'hwnd'パラメータのためにウィンドウのハンドルを' TrackPopupMenu [ex] 'に渡してください。これは、メッセージを受け取るウィンドウを示すためです。 –

関連する問題