C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: コントロールのウインドウ一番上からの座標を取得する


(過去ログ 141 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■82641 / inTopicNo.1)  コントロールのウインドウ一番上からの座標を取得する
  
□投稿者/ 残玉金 (1回)-(2017/01/23(Mon) 12:06:25)

分類:[.NET 全般] 

VBです

コントロールの位置座標は
Control.Locationプロパティで取得することができます。
しかし、これはタイトルバーの下からの座標なので、
SystemInformation.CaptionHeight
を足し算しないとウインドウ一番上からの座標を取得することができません。

一つのコマンドでウインドウ一番上からの座標を取得できる方法があれば
教えてください。



引用返信 編集キー/
■82642 / inTopicNo.2)  Re[1]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ 残玉金 (2回)-(2017/01/23(Mon) 12:09:18)
すいません、あと
コントロールがタブコントロールやパネルコントロールの中に入っている場合


aaa = TableLayoutPanel2.Location.Y + TabControl1.Location.Y + Button2

というように全て足し算する必要がありますが
これも一発でButton2のウインドウ一番上からの位置を取得できる方法があれば教えてください




引用返信 編集キー/
■82644 / inTopicNo.3)  Re[2]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ Hongliang (491回)-(2017/01/23(Mon) 12:49:59)
一発は無理ですが、該当ControlのPointToScreenメソッドでスクリーン座標に変換して、FormのLeftとTopをそれぞれ減算すればいいかと。
引用返信 編集キー/
■82652 / inTopicNo.4)  Re[3]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ 残玉金 (4回)-(2017/01/23(Mon) 16:58:17)
ありがとうございます。

試してみたのですが
なぜかうまくいきません。






Private Function Location_Find(ByVal Con1 As Control) As Point

Dim sp As Point = Me.PointToScreen(Con1.Location)

sp.X = sp.X - Me.Location.X
sp.Y = sp.Y - Me.Location.Y + SystemInformation.CaptionHeight

Return Me.PointToClient(sp)

End Function

という関数を定義した上で、


Cursor.Position = Location_Find(Me.Button17)

で呼び出したのですが、
なぜか実際のボタンよりも左上にカーソルが移動してしまいます。
ボタンがタブページに入っているからかと思い、
外に出しても試してみましたが
やはり左上の方になってしまいます。

一体なにが原因でしょうか?


引用返信 編集キー/
■82653 / inTopicNo.5)  Re[4]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ Hongliang (492回)-(2017/01/23(Mon) 17:13:32)
Form.Location(やLeftやTop)は、タイトルバーやフォームのボーダーの外側の、まさにフォームの一番左上の位置を表します。
なので、後でCaptionHeightなどを足し込む必要はありません。
引用返信 編集キー/
■82654 / inTopicNo.6)  Re[5]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ 残玉金 (5回)-(2017/01/23(Mon) 17:53:26)
SystemInformation.CaptionHeight
を足さずにも試しているのですが
それだと更に左上の方になってしまいます
何が原因でしょうか?
 
引用返信 編集キー/
■82655 / inTopicNo.7)  Re[6]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ 残玉金 (6回)-(2017/01/23(Mon) 18:01:30)


Private Function Location_Find(ByVal Con1 As Control) As Point

Dim sp As Point = Me.PointToScreen(Con1.Location)

sp.X = sp.X '- Me.Location.X
sp.Y = sp.Y '- Me.Location.Y '+ SystemInformation.CaptionHeight

' Return Me.PointToClient(sp)
Return sp

End Function


とすることで、ボタンがタブコントロールの外にある場合にはうまくいきました

しかしタブコントロールの中に入っている場合には
やはりずれてしまうのですが
どのようにすれば良いですか?
 
引用返信 編集キー/
■82657 / inTopicNo.8)  Re[7]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ Azulean (775回)-(2017/01/23(Mon) 22:06:59)
No82655 (残玉金 さん) に返信
> Dim sp As Point = Me.PointToScreen(Con1.Location)

PointToScreen はそのコントロールからの相対座標がスクリーン上の座標に変換するためのメソッドです。
このコードでは Me = フォームの内側の左上からの相対座標をスクリーン座標に変換します。

タブコントロールやパネルの中に貼り付けられたコントロールの Location は、そのタブコントロールやパネルの内側の左上が起点(0, 0)となっているので、正しくない座標を渡しています。


> しかしタブコントロールの中に入っている場合には
> やはりずれてしまうのですが
> どのようにすれば良いですか?

そのケースでは、Me の代わりにタブコントロールを使うのが本筋です。
ただ、そうなると、親コントロールをいちいち調べないといけないので、Con1.Parent.PointToScreen(Con1.Location) とするかですね。
引用返信 編集キー/
■82658 / inTopicNo.9)  Re[8]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ 残玉金 (8回)-(2017/01/24(Tue) 09:52:46)
うまくいきました

ありがとうございます。
 
引用返信 編集キー/
■82659 / inTopicNo.10)  Re[9]: コントロールのウインドウ一番上からの座標を取得する
□投稿者/ PANG2 (156回)-(2017/01/24(Tue) 10:16:06)
2017/01/24(Tue) 10:25:06 編集(投稿者)

>該当ControlのPointToScreenメソッドでスクリーン座標に変換

Cursor.Position = button1.PointToScreen(Point.Empty); // (0,0)

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -