コントロールのスクリーン座標(絶対座標)を取得する(C#)

  • このエントリーをはてなブックマークに追加
  • LINEで送る

VisualStudio(C#)にて開発が続いていますが、コントロール(Button)絶対座標の取得について気づきがありましたので共有したいと思います。

VisualStudioには標準のカレンダーコントロールはありませんので、MonthCalendarを直接組み入れてVisibleを制御する、もしくはMonthCalendarの別フォームを作成した上でモーダル表示(ShowDialogメソッドを利用)を行い、日付(Datetime)を取得する方法が想定されます。

どの方法でもいいのですが、カレンダー(を含むフォーム)のLocationを制御し、ボタンの直下に表示されるように設定する必要があります。
CalendarControlImage

今回はキーボード操作を独立させたい事と、カレンダー表示中は別操作を禁止させたい事から別フォーム&モーダル表示の方法を選択しています。

さて、各コントロールのプロパティを見みるとそれぞれにLocationがあり、配置はこちらで決定されます。しかし、この値はは親コントロールからの相対座標を示していますので、スクリーン上の絶対座標とは異なります。

コントロールには共通項目してコントロール上の位置(PointToClientメソッド)とスクリーン上の位置(PointToScreenメソッド)がありますので、今回はPointToScreenメソッドを使用します。(各メソッドの詳細はMSDNをご参照ください)

さて、PointToScreenメソッドを使うはいいのですが、どのコントロールを基準にどういった座標を渡せばいいのか?というところで躓いてしましました。
絶対座標の取得について検索してみると概ねクライアント座標を取得してからスクリーン座標に変換していたのですが、この方法では上手く座標が得られなかったのです。

そこで、試しにボタン基準(自分基準)のPointToScreenを取得してみると…上手くいきました。

このままですとフォームが画面端に移動したときに正常に表示されませんので実際に利用するにはカレンダー側のShowDialogメソッドで領域修正を行います。

上手くいくとこのような感じでボタンの真下にカレンダーフォームが表示されます。
CalendarControlImage2

カレンダーフォームの最大化ボタン、最小化ボタンはあらかじめ非表示にしていますのであしからず。

SNSでもご購読できます。

スポンサー リンク

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください