質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

18042閲覧

Panelの中にPanelを配置した際の、Locationの値について教えてください。

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2016/03/01 03:00

編集2016/03/01 03:58

いつも大変お世話になっております。

Form1 (サイズ:1000x500)
Panel1 (サイズ:300x300 Location:600,100)
Panel2 (サイズ:200x200 Location:50.50)
Panel3 (サイズ:200x200 Location:350,150)

Panel3をクリックした際、Panel2の位置に移動させたいのですが、
panel2のLocationはPanel1からの相対座標になっているため、どのようにプログラムを書く必要があるのでしょうか。
絶対座標からの値を持ってきて、panel3.Location = new Point(X, Y);などで移動させるしかないのでしょうか?
出来れば、Panel2の相対座標を利用し、Panel3を動かしたいと思っております。

お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2016/03/02 01:34

各Panelの親子関係はどうなってますか?
guest

回答2

0

こんにちは。

下記2つが考えられると思います。

①Panel1をPanel3の親とし、Panel2の座標をPanel3へ設定する。
②Panel3の座瘡に、Panel1の座標(Form相対ですね)+Panel2の座標(Panel1相対ですね)を設定する。

Z軸に注意下さい。(Panel1やPanel2の下にPanel3が入り込むこともあります。)

投稿2016/03/02 01:52

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2016/03/02 02:31

お答えありがとうございました。 考え方大変参考になりました。 今後に活かさせて頂きます。
guest

0

ベストアンサー

C#

1Panel3.Location = Form1.PointToClient(Panel2.PointToScreen(Panel2.Location));

こんな感じでいかがでしょう?

※サンプルの間違いを修正しました。

投稿2016/03/01 10:18

編集2016/03/02 03:23
tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2016/03/02 01:16

お答えありがとうございます。 もう少し知恵をお借りしてもよろしいでしょうか? このソースコードではパソコン画面左上を原点にとった座標が返ってくると思うのですが、Form1左上を原点とすることはできますでしょうか? 自身で調べてはみたものの、解決できなかったため、お手数おかけして申し訳ございませんが、ご教授願えませんでしょうか?
tkanda

2016/03/02 01:54 編集

スクリーン座標からクライアント座標(任意のコントロールからの相対座標)への返還は Control.PointToClient() で行うことができます。 Panel2が実際にはもっと深くネストしている、あるいはネストの段数が不定などの条件を想定されているのかな、と想像しています。 このような場合は、いったんPanel2のLocationをPointToScreen()して、その結果をForm1.PointToClient()してあげると、コードがシンプルになると思います。 つまり・・・ Panel3.Location = Form1.PointToClient(Panel2.PointToScreen(Panel2.Location)); こんな感じで書けるのではないかと。
fender0131

2016/03/02 02:30

お答えありがとうございます。 思い通りの結果を出力することができました。 分かりやすいご説明ありがとうございました。 大変勉強になりました。 以下自分が参照したページも載せておきます http://dobon.net/vb/dotnet/control/pointtoclient.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問