« Raspberry PiでもMiguフォントを使う | トップページ | Raspberry PiでYoutube動画を再生する »

2014-12-02

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の下にポップアップメニューが表示される。

|

« Raspberry PiでもMiguフォントを使う | トップページ | Raspberry PiでYoutube動画を再生する »

CBuilder」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する:

« Raspberry PiでもMiguフォントを使う | トップページ | Raspberry PiでYoutube動画を再生する »