Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する
ボタンの下にポップアップメニューを表示したい時など、任意の場所にポップアップメニューを表示したいが、ポップアップメニューのPopup関数に渡す引数の座標はスクリーンの座標なので基準となるコントロールの座標を渡してしまうと、とんでもない所に表示されたりする。
そんな時にTControl::ClientToScreen関数が使える。この関数はconst TPoint&を引数に取って、TPointを返す。どうせならTPopupMenu::Popup関数も引数にTPointが渡せたらいいのに。と、思うが、取り敢えずX座標とY座標を別々に渡す。
void __fastcall TForm1::Button1Click(TObject *Sender) { TPoint button_point(0, Button1->Height); // ボタンの左下の座標 TPoint popup_point = Button1->ClientToScreen(button_point); // スクリーン座標に変換 PopupMenu1->Popup(popup_point.x, popup_point.y); // ポップアップメニューをポップアップ }
上のサンプルでは、フォームにButton1とPopupMenu1という名前のTPopupMenuを置く。
Button1はTControlから派生していればTButtonじゃなくても問題ないが、ここではとにかくButton1という名前にする。
Button1のクリックイベントハンドラにサンプルのコードを書いておくと、Button1をクリックするとButton1の下にポップアップメニューが表示される。
| 固定リンク
「CBuilder」カテゴリの記事
- 一定時間アイドル状態が続いたら何かをしたい(2015.11.26)
- TMetafileへの描画が反映されない(2015.07.30)
- TDataModuleはClientHeightプロパティを持っていない(2015.02.19)
- VCLのTStringsを検索キーワードのトークナイザー的に使ってみる(2014.12.18)
- Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する(2014.12.02)
この記事へのコメントは終了しました。
コメント