仮にデスクトップの表示サイズが800×600であった場合に左上座標を750,550で
指定してTrackPopupMenuを実行すると
(ポップアップメニューのサイズはだいたい100×200ぐらいとします)
ポップアップメニューは右下隅に入りきる様に表示さてしまいこちらが指定した
座標とポップアップメニューの左上座標が合わなくなってしまいます。
表示されたポップアップメニューの左上座標を得るためにはどうすればよいで
しょうか?
GetMenuItemRectでポップアップメニューのサイズを測定
⇒はみ出す場合は自力で計算する
というのはどうでしょう。
GetMenuItemRectを使いパラメータを
ビューのウィンドウハンドル
ポップアップメニューのハンドル
ID指定は0
CRectのアドレス
の設定では帰ってきたデータがフレームウィンドウが使用中のメニューの0番項目の
左上座標(スクリーン座標)サイズは(0,0)であり
上記のビューのウィンドウハンドルをNULLで指定すると、リターンコードがFALSEにな
りデータは取得できません。
あと自力計算をしようかとも思ったのですがポップアップメニューのフォントサイズが
判らなくて計算が出来ません、実測では高さが16ドット・セパレータの場合8ドット
でしたがこれはメインで使用しているXPマシンの場合で別のWIN7の場合は普通の項目は
19ドット、セパレータは9ドットでした。
ちなみにメニューをオーナードロー設定したところMEASUREITEMの設定はなしでDRAWITEM
時に矩形の高さが18ドットになっていました。
メニュー表示中ならば、
たとえば WM_MENUSELECTで GetMenuItemRectから取り出すことができます。
TrackPopupMenu呼出し後で表示前ならば
WM_INITMENUPOPUPでEnumWindowsからクラス名=#32768のウィンドウを見つけ、
この段階ではウィンドウの大きさはいい加減なので、
ウィンドウをサブクラス化し、
WM_WINDOWPOSCHANGINGが来るのを待つ。
1回目のWM_WINDOWPOSCHANINGでは
SWP_NOOWNERZORDER|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE
2回目のWM_WINDOWPOSCHANGINGでは
SWP_NOOWNERZORDER|SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOSIZE
が来る。
こんな感じになると思います(少しめんどい)。
TrackPopupMenuの呼び出し前だと、
SPI_GETNONCLIENTMETRICSからfontを求めるのかなぁ。
これは試していません。
TrackPopupMenu後のWM_INITMENUPOPUPでFindWindowしてサブクラス化し
1回目のWM_WINDOWPOSCHANINGで
ポップアップウィンドウのサイズが来るので保存し
2回目のWM_WINDOWPOSCHANGINGで
ポップアップウィンドウの表示位置がくるのでこちらの都合のいい位置へ変更し
マウスカーソルも座標を変更してポップアップウィンドウの一番トップのメニューアイ
テムの位置にマウスカーソルをセットすることが出来ました。
ちょっと入院していたので返事が遅くなりました、有難うございました