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

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

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

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

Q&A

解決済

2回答

444閲覧

【C#】Formのウィンドウサイズと実際のサイズとの違い

turnberry0712

総合スコア4

C#

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

1グッド

0クリップ

投稿2025/06/05 09:54

編集2025/06/05 12:00

実現したいこと

C#でフォームの全体サイズではなく、アイテムが置けるサイズを800,600にします。
816, 639にすると、綺麗に800,600になります。

panelアイテムを、親コンテナにドッキングすると使いpanelを見ると800,600になります。
このように、アイテムが置ける部分をオプションで仕様できるようにしたいです。

発生している問題・分からないこと

フォームのアイテムを置くスペースの実数値を知りたい。
そこから自動(プログラム)的に変更された数値を一番近い数値に変えたい。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

panelアイテムを親コンテナに合わせるとどの位の大きさなのかが分かった。

補足

「Form1.Designer.cs」から

namespace Hit_and_Blow
{
partial class HitAndBlow
{
#region Windows Form Designer generated code

/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { SuspendLayout(); // // HitAndBlow // AutoScaleDimensions = new SizeF(9F, 21F); AutoScaleMode = AutoScaleMode.Font; AutoScroll = true; ClientSize = new Size(800, 600); // ここ Font = new Font("Yu Gothic UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 128); Margin = new Padding(4); Name = "HitAndBlow"; StartPosition = FormStartPosition.CenterScreen; Text = "Hit & Blow"; Click += HitAndBlow_Click; ResumeLayout(false); } #endregion }

}

// ここ
と書いた、部分(20行目)にNEWされております。

TN8001👍を押しています

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

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

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

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

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

fana

2025/06/05 10:31

ClientSize だとダメかな?
YAmaGNZ

2025/06/05 12:24

ClientSizeが指定のサイズ(例えば800x600)になるようにフォームのサイズを変更したい という内容ととらえて回答したのですが合っていますか?
turnberry0712

2025/06/05 13:44

Form設定後、ユーザーがFormをを変更し終えた時に一番近い4:3、もしくは16:9にしようと考えております。 fana様 やってみます。 YAmaGNZ様 私が触っていない部分、 public HitAndBlow() { InitializeComponent(); } InitializeComponent();にnewして生成して初期化しているともうのですが、ゲーム上でもユーザーがトップFormに行ったときにリセットボタンを押したら、初期化したいです。 お二人とも返事が遠くなり申し訳ありません。
YAmaGNZ

2025/06/05 22:15

>Form設定後、ユーザーがFormをを変更し終えた時に一番近い4:3、もしくは16:9にしようと考えております。 おっしゃっていることがよく分かりません。 Form設定後とはどのタイミングですか?実行している間に何かしらの設定画面があってその設定が完了したタイミングということですか? ユーザーがFormを変更とは何を変更するのですか? 4:3もしくは16:9にアスペクト比を固定したいとのことですがこれとClientSizeは何の関係があるのでしょうか? 一番近いということですが、幅と高さのどちらを優先するかなどありそうですがそのあたりはどのようにお考えですか?
turnberry0712

2025/06/06 00:39

>>Form設定後、ユーザーがFormをを変更し終えた時に一番近い4:3、もしくは16:9にしようと考えております。 >おっしゃっていることがよく分かりません。 はい…そうですね。画質の比率の事を申し上げたつもりでしたが伝わらず、すみませんでした。次から気をつけて発言致します。 >Form設定後とはどのタイミングですか? ユーザーの起動二回目以降の起動時にファイルデータの読み込みを想定しています。ファイルの中に画素数を書いておこうと思ってます。 >実行している間に何かしらの設定画面があってその設定が完了したタイミングということですか? 上記の話に関する話にもなりますが、 システム起動した後、ユーザーに画面が表示される前のタイミングで、フォームの縦幅横幅を変えたいと考えてます。 >ユーザーがFormを変更とは何を変更するのですか? ユーザーがフォームの解像度を変える事を伝えたかったです。 >4:3もしくは16:9にアスペクト比を固定したいとのことですがこれとClientSizeは何の関係があるのでしょうか? 解像度をを4:3か16:9に固定しようかと思ってます。 >一番近いということですが、幅と高さのどちらを優先するかなどありそうですがそのあたりはどのようにお考えですか? そこに関してはユーザーに 解像度を変更してからこの大きさでよろしいですか? と、実際に変更しつつ別ダイアログを表示させてOK.NGを出して決めてもらおうと思ってます。
YAmaGNZ

2025/06/06 02:10

>ユーザーがフォームの解像度を変える とありますが、フォームの大きさを変更するという行為は画面端をマウスでドラッグして大きさを変更するという行為もあります。 これのことを言っているのでしょうか? >システム起動した後、ユーザーに画面が表示される前のタイミングで、フォームの縦幅横幅を変えたいと考えてます。 起動時に設定した大きさで表示するというのは分かるのですが、ではその設定というのはいつ変更するのでしょうか? 変更時に即時反映する必要があるのでしょうか? >解像度を変更してからこの大きさでよろしいですか?と、実際に変更しつつ別ダイアログを表示させてOK.NGを出して決めてもらおうと思ってます。 例えばフォームの大きさが600x600だったとして4:3のアスペクト比にする場合 縦を優先するのであればフォームの大きさは800x600となります。 横を優先するのであればフォームの大きさは600x450となります。 これのどちらを選択するのですか? 私の回答で不足があるのでしょうか?あなたが思っていることと異なるのであれば何が異なるのかを説明していただければ他の方法なりを提示できるのではないかと思います。
turnberry0712

2025/06/06 09:17

Q「>ユーザーがフォームの解像度を変える とありますが、フォームの大きさを変更するという行為は画面端をマウスでドラッグして大きさを変更するという行為もあります。 これのことを言っているのでしょうか?」 A はい、その認識であっております。 Q「 >システム起動した後、ユーザーに画面が表示される前のタイミングで、フォームの縦幅横幅を変えたいと考えてます。 起動時に設定した大きさで表示するというのは分かるのですが、ではその設定というのはいつ変更するのでしょうか? 変更時に即時反映する必要があるのでしょうか?」 A ありませんが、なんとなく考えているだけなので気にしないでください。 Q「>解像度を変更してからこの大きさでよろしいですか?と、実際に変更しつつ別ダイアログを表示させてOK.NGを出して決めてもらおうと思ってます。 例えばフォームの大きさが600x600だったとして4:3のアスペクト比にする場合 縦を優先するのであればフォームの大きさは800x600となります。 横を優先するのであればフォームの大きさは600x450となります。 これのどちらを選択するのですか?」 A まだ決めてないので今質問に答える事ではないかと思います。メインの質問がFormの大きさが実際Sizeとthis.ClientSizeで差がありますねーくらい簡単にとらえてもらってかまわないかと思いますが。 Q「私の回答で不足があるのでしょうか?あなたが思っていることと異なるのであれば何が異なるのかを説明していただければ他の方法なりを提示できるのではないかと思います。」 A 不足はないです。不穏な空気出すのやめてもらっていいですか?空気読めますか? 終わった質問に質問して俺スゲーできてすごいのですが、製作するのはそちらならいろいろ決めるために話すと思うんですよ。で、実際どうだかわかってもらえました(空気読めた)でしょうか。
turnberry0712

2025/06/06 09:20

回答に必要な情報があればご指摘ください。
TN8001

2025/06/06 14:50

> フォームのアイテムを置くスペースの実数値を知りたい。 > そこから自動(プログラム)的に変更された数値を一番近い数値に変えたい。 端的な回答 ClientSizeで取得も設定もできます。 [Form.ClientSize プロパティ (System.Windows.Forms) | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.clientsize) 知りたいときに好きに表示して、変えたいときに好きに設定してください。 InitializeComponent(); Debug.WriteLine(ClientSize); ClientSize = new Size(800, 600); >> 私の回答で不足があるのでしょうか?あなたが思っていることと異なるのであれば何が異なるのかを説明していただければ他の方法なりを提示できるのではないかと思います。 > 不足はないです。 > 終わった質問に質問して 解決したのであれば、ベストアンサーボタンをクリックしてください。 [ヘルプ|質問を解決済みにしたい](https://teratail.com/help#resolve-question) 回答のコメントに「ベストアンサーに選ばせていただきました。」とあるのに「ベストアンサー」にできていないので、まだ何か問題があるだろうと思って回答者は色々聞いているわけです。 回答者は別に質問者や質問者が作ろうとしているプログラムを詮索する気も興味もありません。 困っている人がいて自分は回答できそうだなと思うから、善意で回答しているだけです。 > 回答に必要な情報があればご指摘ください。 個人的な感想です(turnberryさんを責めているのではなく、第3者から見た質問の見え方というか質問の仕方について) 余計な情報が多く、肝心な情報がない気がします。 わたしは当初Visual StudioのデザイナのプロパティでClientSize変えたい。 できないにしてもClientSize(800, 600)に対応する、Size(816, 639)をぱっと知りたい。 ような話かと思っていました(それ用の動画も作っていました^^; しかし >> ClientSize だとダメかな? > やってみます。 の進捗はなく、アス比の話や設定等にずれていっているように見えました。 本当にやりたいことが「アス比固定のままリサイズできるフォーム」であるなら、安直にやるとちらつきますしちゃんとやると急に難しくなったりします。 わたしはまだ「本当にやりたいこと」が、なんなのかわかっていません。 [XY問題 - Wikipedia](https://ja.wikipedia.org/wiki/XY%E5%95%8F%E9%A1%8C)
turnberry0712

2025/06/07 00:01

>ClientSizeで取得も設定もできます。 >知りたいときに好きに表示して、変えたいときに好きに設定してください。 これをベストアンサーにしたいので解答欄にご記入いただけないでしょうか。 計算して値を持っているよりもスマートで好きです。 >回答のコメントに「ベストアンサーに選ばせていただきました。」とあるのに「ベストアンサー」にできていないので、まだ何か問題があるだろうと思って回答者は色々聞いているわけです。 申し訳ありません。ベストアンサーを押したつもりが、押していない反応になっておりました。こればかりは私の落ち度です。大変申し訳ございません。 >わたしはまだ「本当にやりたいこと」が、なんなのかわかっていません。 できればアスペクト比を使いつつ、フォームの大きさを決めたい。大きさはアスペクト比で決められた数字にしたいです。しかし、ユーザーがそれを求めないのであれば、ユーザーの好きな数字にしたい。 アスペクト比でフォームの大きさを決める。しかし、ユーザーが大きさを決めたいのならそちらを優先する。 クライアントサイズ部分以外を含め、アスペクト比につけるのか分からない部分があります。
guest

回答2

0

ベストアンサー

アスペクト比でフォームの大きさを決める。しかし、ユーザーが大きさを決めたいのならそちらを優先する。

アスペクト比とは横と縦の比率ですから、480*360640*480800*600みんな4:3です。
大きさは決められません。

「アス比固定のままリサイズできるフォーム」に言及がないことから、枠をつかんでのリサイズは必要ないということでしょうかね?

「こういうことかな?」というサンプルを作りました。
本来はメインフォームと設定フォーム2つになるのかもしれませんが、めんどくさいので兼用です^^;
フォーム間での値のやり取りはFAQですのでググってください(teratailにもたくさんあると思います)

  • RadioButton2つ
  • ComboBox1つ
  • NumericUpDown2つ
  • Button1つ

をテキトウに置いてください。
イベントはそれぞれちゃんと設定してください。

cs

1using System; 2using System.Diagnostics; 3using System.Drawing; 4using System.Windows.Forms; 5 6namespace Q2gisw7a655rber 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 14 // プロパティウィンドウで設定してよい 15 FormBorderStyle = FormBorderStyle.FixedSingle; 16 radioButton1.Text = "4:3"; 17 radioButton2.Text = "16:9"; 18 comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; 19 button1.Text = "設定"; 20 // ここまでプロパティで設定してよい 21 22 23 var size = "800*600"; // ファイル等から読み込んだテイ 24 var width = int.Parse(size.Split('*')[0]); 25 var height = int.Parse(size.Split('*')[1]); 26 27 // (798*599等整数では誤差が出るので)4:3に十分近ければ... 28 if (Math.Abs(width / (double)height - 4 / 3d) < 0.01) 29 { 30 radioButton1.Checked = true; 31 } 32 else 33 { 34 radioButton2.Checked = true; 35 } 36 37 comboBox1.SelectedItem = size; 38 numericUpDown1.Value = width; 39 numericUpDown2.Value = height; 40 41 ClientSize = new Size(width, height); 42 } 43 44 // radioButton1・radioButton2共通 45 private void RadioButton_CheckedChanged(object sender, EventArgs e) 46 { 47 comboBox1.Items.Clear(); 48 49 if (radioButton1.Checked) // 4:3 50 { 51 comboBox1.Items.AddRange("480*360,640*480,800*600,1024*768".Split(',')); 52 53 numericUpDown1.Maximum = 7680; // 比率に合った上限加減(数値に特に根拠はない) 54 numericUpDown2.Maximum = 5760; 55 numericUpDown1.Minimum = 320; 56 numericUpDown2.Minimum = 240; 57 58 } 59 if (radioButton2.Checked) // 16:9 60 { 61 comboBox1.Items.AddRange("480*270,640*360,800*450,1024*576".Split(',')); 62 numericUpDown1.Maximum = 7680; 63 numericUpDown2.Maximum = 4320; 64 numericUpDown1.Minimum = 320; 65 numericUpDown2.Minimum = 180; 66 } 67 68 comboBox1.SelectedIndex = 0; 69 } 70 71 private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e) 72 { 73 var size = (string)comboBox1.SelectedItem; 74 var width = int.Parse(size.Split('*')[0]); 75 var height = int.Parse(size.Split('*')[1]); 76 77 numericUpDown1.Value = width; 78 numericUpDown2.Value = height; 79 } 80 81 // numericUpDown1・numericUpDown2共通 82 private void NumericUpDown_ValueChanged(object sender, EventArgs e) 83 { 84 if (sender == numericUpDown1) // width 85 { 86 if (radioButton1.Checked) 87 { 88 numericUpDown2.Value = numericUpDown1.Value * 3 / 4; 89 } 90 if (radioButton2.Checked) 91 { 92 numericUpDown2.Value = numericUpDown1.Value * 9 / 16; 93 } 94 } 95 if (sender == numericUpDown2) // height 96 { 97 if (radioButton1.Checked) 98 { 99 numericUpDown1.Value = numericUpDown2.Value * 4 / 3; 100 } 101 if (radioButton2.Checked) 102 { 103 numericUpDown1.Value = numericUpDown2.Value * 16 / 9; 104 } 105 } 106 } 107 108 private void Button1_Click(object sender, EventArgs e) 109 { 110 var width = numericUpDown1.Value; 111 var height = numericUpDown2.Value; 112 ClientSize = new Size((int)width, (int)height); 113 } 114 } 115}

アプリ動画

投稿2025/06/07 09:20

TN8001

総合スコア10091

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

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

TN8001

2025/06/07 09:33

蛇足ですが クライアントエリアが4:3・16:9両対応かつサイズも可変となると、中に置くコントロール類の処置のほうが大変そうですね... TableLayoutPanel?全部Paint?? WPFならViewBoxなんかで割とどうとでもなるんですが^^;
turnberry0712

2025/06/07 22:44

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。 Panelを置いて対策しようと思います。 この度はありがとうございました。またよろしくお願いいたします。
guest

0

実行時にフォームのサイズからClientSizeを引いた値を覚えておきサイズ変更時に足してやるのはどうですか?

起動時に

C#

1private int cx,cy; 2 3public Form1() 4{ 5 InitializeComponent(); 6 7 cx = this.Width-this.ClientSize.Width; 8 cy = this.Height - this.ClientSize.Height; 9}

といった感じで覚えておいてリサイズ時に

C#

1 this.Size = new Size(800 +cx,600 + cy);

と指定の大きさに足してやればクライアントサイズが指定の大きさになるかと思います。

追記

何かしらの設定画面にてフォームのサイズやアスペクト比を設定できるといったものだったとした場合

settingform

C#

1public class settingform 2{ 3 private string screensize() = {"800x600","1024x768","1920x1080"} // 設定できる画面サイズ 4 5 public int settingwidth; // 設定画面にて設定された画面幅を格納する 6 public int settingheight; // 設定画面にて設定された画面高を格納する 7 8 // その他の処理 9}

といった設定用のダイアログを作成し、画面サイズはいくつかの候補から選択するといった形にし

C#

1 2 if(settingform.ShowDialog() == DialogResult.OK) 3 { 4 this.Size = new Size(settingform.settingwidth + cx, settingform.settingheigth + cy); 5 } 6

とダイアログで設定されたものに変更するといった形にすればあまり複雑なことを考えなくてもいいのではないでしょうか。

投稿2025/06/05 11:24

編集2025/06/05 22:58
YAmaGNZ

総合スコア10592

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

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

turnberry0712

2025/06/08 11:21 編集

回答ありがとうございます。 非常に参考になりました。 このソースを基準に考えてみます!
KOZ6.0

2025/06/07 07:25

Size は加算、減算ができますよ。 Size frameSize = this.Size - this.ClientSize; Size WindowsSize = this.ClientSize + frameSize; こんな感じ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問