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

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

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

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

10255閲覧

ButtonのLocationと実行時の位置が一致しない

Sukabo

総合スコア31

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/04/28 08:09

編集2020/04/30 07:54

実行環境: visual studio 2019
.NET Framework 4.7.2

Windowsアプリケーションをつくっていて、ボタンの位置をプログラムで書き換えようとしています。
まずコモンコントロールのButtonを、置きたい位置(例えば(a, b)とする)にドラッグして置いて、その時のプロパティでのLocationの値を確認して、その値をプログラムで書き込もうとしています。

C#

1Button.Location = new Point(a, b);

これでデバッグすると、なぜかボタンがドラッグして置いたときよりも右下にずれて表示されます。
解決方法を教えてくださると幸いです。

試したこと

・ボタン2(button2)を(100, 100)の位置にForm1.cs[デザイン]にて手動で配置してConsole.WriteLine(button2);として実行すると出力には{X=75,Y=80}と出る
・ボタン1(button1)をbutton1.Location = new Point(100, 100);でボタン2((100, 100)に手動で配置)に重ねようとしても、右下にずれて表示される
・新規プロジェクトを作成してボタン2つだけ配置して試しても同様

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

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

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

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

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

YAmaGNZ

2020/04/28 09:55

どのようにしてその座標(a.b)を取得しているのですか?
Sukabo

2020/04/28 10:55

ウィンドウに「プロパティ」の欄があるので、そこの値を見て知ります。
Sukabo

2020/04/28 10:57

説明が難しいのですが、「ツールボックス」とか「エラー一覧」などと同様にVisual Studioのウィンドウに表示されているもののことです。
Zuishin

2020/04/28 11:03

Parent が設計時と実行時で違うとか、ウィンドウの大きさが違うとか、モニタの解像度が違うとか、色々と考えられますが、座標で指定するのは悪手です。TableLayoutPanel などを活用し、Dock で指定しましょう。
退会済みユーザー

退会済みユーザー

2020/04/28 11:40

・ずれるというのは、どの程度ずれますか?デバッガーでブレークポイントを設定し、書きかえる前のLocation, 書きかえた後のLocationを確認してください。 ・プログラムで書き込んだタイミングはどこでやってますか? ・ボタン1、ボタン2 と置いて、ボタン1のLocation にボタン2のLocationを書き込んだらぴったり重なりますか?その時のLocationの値は?
KOZ6.0

2020/04/28 11:52

そもそも位置は変わらないのに再配置しようとしているのはなぜでしょう?
Sukabo

2020/04/28 11:57

Form1_Load()内で行っています。 ボタン2を(100, 100)に手動で置いて、ボタン1をプログラムで書き換えたところ(button1.Location = new Point(100, 100);)、デバッガによるとボタン1の座標は(0x64, 0x64)、つまりボタン2の位置になっているにもかかわらず、ボタン2の少し右下にずれていました。
Sukabo

2020/04/28 12:04

KOZ6.0さん ボタンをある特定の位置に後からプログラム実行中に移動させたいので、ドラッグしてその位置の座標を調べています。
Zuishin

2020/04/28 12:09

app.config で直りそうな気もするけど診断のための詳細を聞いても答えそうにないな。
Sukabo

2020/04/28 12:13

なぜそう思われたのかよくわかりませんが、必要事項は答えます。
Zuishin

2020/04/28 12:16 編集

なぜって、現時点で考えられる理由と対処法を並べても全く反応がないから。
Sukabo

2020/04/28 12:17

そうでしたか。大変失礼しました。
退会済みユーザー

退会済みユーザー

2020/04/28 12:55 編集

button2を押すと、button1がbutton2の位置(100,100)に移動するだけのプログラムを作成しました。 これでもやはりズレは発生しますか? (削除しました)
KOZ6.0

2020/04/28 12:33 編集

ボタン2の挙動を見ると、ボタン1の Parent が Form になっていない気がします。 (Zuishin さんが触れてらっしゃいますね。) designer.cs を開いてボタン2との違いを見てみましょう。
Sukabo

2020/04/28 12:34

namespace typing_game { partial class Form1 { /// <summary> /// 必要なデザイナー変数です。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> /// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows フォーム デザイナーで生成されたコード /// <summary> /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// </summary> private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); this.axWindowsMediaPlayer1 = new AxWMPLib.AxWindowsMediaPlayer(); this.makeButton = new System.Windows.Forms.Button(); this.gameTitle = new System.Windows.Forms.Label(); this.playButton = new System.Windows.Forms.Button(); this.titlePanel = new System.Windows.Forms.Panel(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.axWindowsMediaPlayer1)).BeginInit(); this.titlePanel.SuspendLayout(); this.SuspendLayout(); // // axWindowsMediaPlayer1 // this.axWindowsMediaPlayer1.Enabled = true; this.axWindowsMediaPlayer1.Location = new System.Drawing.Point(94, 360); this.axWindowsMediaPlayer1.Name = "axWindowsMediaPlayer1"; this.axWindowsMediaPlayer1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWindowsMediaPlayer1.OcxState"))); this.axWindowsMediaPlayer1.Size = new System.Drawing.Size(559, 44); this.axWindowsMediaPlayer1.TabIndex = 0; // // makeButton // this.makeButton.Font = new System.Drawing.Font("MS UI Gothic", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); this.makeButton.Location = new System.Drawing.Point(144, 274); this.makeButton.Name = "makeButton"; this.makeButton.Size = new System.Drawing.Size(167, 57); this.makeButton.TabIndex = 1; this.makeButton.Text = "つくる"; this.makeButton.UseVisualStyleBackColor = true; this.makeButton.Click += new System.EventHandler(this.makeButton_Click); // // gameTitle // this.gameTitle.Font = new System.Drawing.Font("MS 明朝", 70.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128))); this.gameTitle.ForeColor = System.Drawing.Color.LightSeaGreen; this.gameTitle.Location = new System.Drawing.Point(12, 52); this.gameTitle.Name = "gameTitle"; this.gameTitle.Size = new System.Drawing.Size(776, 138); this.gameTitle.TabIndex = 2; this.gameTitle.Text = "Typing Game"; this.gameTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // playButton // this.playButton.Font = new System.Drawing.Font("MS UI Gothic", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); this.playButton.Location = new System.Drawing.Point(456, 274); this.playButton.Name = "playButton"; this.playButton.Size = new System.Drawing.Size(167, 57); this.playButton.TabIndex = 3; this.playButton.Text = "あそぶ"; this.playButton.UseVisualStyleBackColor = true; // // titlePanel // this.titlePanel.Controls.Add(this.button3); this.titlePanel.Controls.Add(this.playButton); this.titlePanel.Controls.Add(this.gameTitle); this.titlePanel.Controls.Add(this.makeButton); this.titlePanel.Location = new System.Drawing.Point(607, 168); this.titlePanel.Name = "titlePanel"; this.titlePanel.Size = new System.Drawing.Size(800, 450); this.titlePanel.TabIndex = 4; // // button1 // this.button1.Location = new System.Drawing.Point(0, 0); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 5; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; // // button2 // this.button2.Location = new System.Drawing.Point(100, 100); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 6; this.button2.Text = "button2"; this.button2.UseVisualStyleBackColor = true; // // button3 // this.button3.Location = new System.Drawing.Point(0, 0); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(75, 23); this.button3.TabIndex = 7; this.button3.Text = "button3"; this.button3.UseVisualStyleBackColor = true; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.titlePanel); this.Controls.Add(this.axWindowsMediaPlayer1); this.Name = "Form1"; this.Text = "Typing Game"; this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this.axWindowsMediaPlayer1)).EndInit(); this.titlePanel.ResumeLayout(false); this.ResumeLayout(false); } #endregion private AxWMPLib.AxWindowsMediaPlayer axWindowsMediaPlayer1; private System.Windows.Forms.Button makeButton; private System.Windows.Forms.Label gameTitle; private System.Windows.Forms.Button playButton; private System.Windows.Forms.Panel titlePanel; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button3; } }
Sukabo

2020/04/28 12:35

Form1.Designer.csの全文ですが、どこか原因は確認できますか。
Sukabo

2020/04/28 12:44

radianさん ちょっと怖いので、実行するのは申し訳ないですが控えさせていただきたいです。
退会済みユーザー

退会済みユーザー

2020/04/28 12:50

ファイルは削除しました。普通にやったら同じ位置になると思うので、何か別の要因がありそうな気がしますね。新規でフォーム作ってボタン二つだけ置いて、同じ事を試してみると多分同じ位置になると思います。
YAmaGNZ

2020/04/28 13:24

デザイナーで配置したものを実行時で Console.WriteLine($"button1.Location = {button1.Location}"); という感じで座標を表示してみたらデザイナで確認した座標とずれていたりしませんか?
KOZ6.0

2020/04/28 13:26

コードは質問文に書いてください。 とりあえず MediaPlayer の部分を panel に変更して designse.cs に張り付け、Form_Load で button1 を Point(100, 100 に位置変更してみましたが現象は再現しませんでした。 提示されていない部分で何かやってるんでしょうか? ひょっとして MediaPlayer が原因?
Sukabo

2020/04/29 00:30

radianさん 新規のプロジェクトを作成してボタンを二つ配置し、Form1_Load内で button1.Location = new Point(100, 100); として、前と同じように実験をしたのですが、同様に右下にずれていました。
Sukabo

2020/04/29 00:54

YAmaGNZさん リンク先のどの部分を参照すればよいでしょうか。 (推奨されている「Visual Studio を DPI 非対応プロセスとして再起動する」の部分は、黄色い情報バーが表示されていないのでできなかったです。)
YAmaGNZ

2020/04/29 01:09

そのページに「通知を無効にする」って項目あるので、その設定を変更してみてください。 それで、スケール100%でデザインするか回答にあるようにmanifestを追加して高DPIに対応するかしてください。manifestに関しては「C# 高DPI対応」などと検索してみてください。
Zuishin

2020/04/29 01:56

YAmaGNZ さん、どちらにしても使えるので問題ありませんが、高解像度の件で manifest より app.config が推奨になったのは 4.7 以降らしいですよ。 https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/high-dpi-support-in-windows-forms > Windows フォームでは、.NET Framework 4.7 以降に追加された新機能とカスタマイズをサポートする新しい<System.Windows.Forms.ApplicationConfigurationSection>要素が導入されています。
Zuishin

2020/04/29 01:58

あ、違う。4.7 以降で manifest が使えるようになり、app.config はそれ以降(いつ?)と読めますね。失礼しました。
Sukabo

2020/04/29 05:54

YAmaGNZさん 「通知を無効にする」の部分では、私の場合すでに「DPI スケーリング通知」がtrueになっていたのでどうしようもなかったですが、manifestファイルの追加をして、今回の問題は解決しました。 時間がかかってしまいましたが、皆さん、ありがとうございました。
YAmaGNZ

2020/04/29 09:15

manifestだとapp.configの設定を上書きしてしまうので推奨しないとありますね。 Zuishinさんの言われるようにapp.configにて対応すべきですね。
YAmaGNZ

2020/04/29 11:31

こちらでは提示されているもので確認して正常な動作をしていると思われます。 exeとconfigは同一フォルダにありますよね?
Sukabo

2020/04/30 07:52

すみません。App.configと間違えてApp1.configの方に上記のコードを追加していました。 無事、想定していたように動作しました。 YAmaGNZさん、Zuishinさん、お二方ともありがとうございました。
guest

回答2

0

ベストアンサー

表示スケールが100%以外になっていたりしませんか?
AutoScaleModeをAutoScaleMode.Noneにして自動スケーリングを無効にするとか
manifestを追加して高DPIに対応するなどしてみてはどうでしょうか?

もしくは、デザイナーが100%のスケールで実行されていない為に、デザイナーで配置した時の値が
そのスケールの座標となってしまっているとか
イメージ説明
このような表示が出てたりしませんか?

下記画像がAutoScaleModeを変更したものです。
イメージ説明イメージ説明
ボタン1が125%スケールのデザイナ上で200,100に配置したもので
ボタン2がコード上でbutton2.Location = new Point(200, 100);としたものです。

投稿2020/04/28 12:03

編集2020/04/28 12:55
YAmaGNZ

総合スコア10222

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

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

Sukabo

2020/04/28 12:11

表示スケールの変更方法が分からなかったのですが、どこで変更できますか。
YAmaGNZ

2020/04/28 12:14

Windowsのディスプレイの設定にありませんか?
Sukabo

2020/04/28 12:15

その表示は出ていないです。
guest

0

そういうのは、どこを基準とした位置か、ってのが重要です
そのボタンが載せられているコンテナの相対位置になるんですが、もしかしてフォームの位置基準でやってたりしませんか。

投稿2020/04/28 08:14

y_waiwai

総合スコア87719

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

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

Sukabo

2020/04/28 11:00

プロパティ欄に載っている値はフォームの左上からの相対的な座標だと思うのですが、 = new Point(a, b); で代入するときは違うということですね。
y_waiwai

2020/04/28 12:06

コード上での0,0がどこになるのか確認してはどうでしょう
Sukabo

2020/04/28 12:10

プログラムで(0, 0)に書き換えたときもフォームの左上になっていたので基準点は同じようです。
y_waiwai

2020/04/28 12:14

なら、その引数のa,bがずれてるってことですね
Sukabo

2020/04/28 12:20

そうですね。 追記・修正依頼のところにコメントしたように、右下にずれるようです。
y_waiwai

2020/04/28 12:24

ならそのa,bのでどころはどこからなのか提示しましょうよ。 あなたの思い込みで位置がずれてると決めつけたところで解決にはなりえませんぜ
Sukabo

2020/04/28 12:31

追記・修正依頼のコメントをコピーします。 「ボタン2を(100, 100)に手動で置いて、ボタン1をプログラムで書き換えたところ(button1.Location = new Point(100, 100);)、デバッガによるとボタン1の座標は(0x64, 0x64)、つまりボタン2の位置になっているにもかかわらず、ボタン2の少し右下にずれていました。」 こういうことですので、a,bの出どころは手動で(プロパティ欄をいじって)得たものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問