ウィンドウのサイズが設定より小さくなる
質問
2018年10月4日木曜日 7:06
Windowsフォームアプリケーションを実行した時の実際のウィンドウのサイズがFormのSizeプロパティで指定した値より小さくなります。
(Width:-14px、Height:-7px)
この現象が発生する原因と、実際のウィンドウサイズをSizeプロパティで指定した通りのサイズにする方法があればご教授いただければと思います。
よろしくお願いいたします。
※開発環境: Windows 10 Pro 64bit、Visual Studio 2015 Express for Desktop、.NET Framework 4.5以降
実行環境: Windows 10 Pro 64bit
すべての返信 (3)
2018年10月4日木曜日 8:35 ✅回答済み | 1 票
.Designer.csを見ると分かりますが、デザイナでSizeを設定したとき、実際のプログラムコードではSizeそのものではなくClientSizeが設定されます。
Visual Studioのデザイナは環境に関わらずWindows 7ライクなウィンドウでデザインしますが、そのボーダーなどが含まれたサイズがSizeであり、そこからボーダーなどの分を引いた分を、.Designer.csのコードでClientSizeとして設定します。
Windows 10のウィンドウでは基本的にボーダーは無いので、ボーダーなどの分、Sizeが小さい状態で表示されます。
一般的な用途ではClientSizeが固定の方が便利なので(そうでないと配置したコントロールが見切れたり変な余白ができたりします)、このようになっているのでしょう。
手軽には、InitializeComponent()のあとでSizeをコードで設定してしまうのがいいでしょう。
2018年10月5日金曜日 1:43
ご回答いただきありがとうございます。
.Designer.csを確認しましたが、ここのClientSizeも実際のウィンドウサイズと完全には合わないので、差分から考えてWindows 10のボーダーは1px固定なのかな、という気がします。
「InitializeComponent()のあとでSizeをコードで設定」を試してみましたが結果は変わらず…ClientSizeの値を目標値から逆算して入力するのが最適解のようです。
2018年10月6日土曜日 2:58 | 1 票
こんにちは。
本件、以前私が投稿した以下の内容とひょっとして同じではないかと思います。
7px と 14px という値がぴったり同じなので。
概要を記載すると…
DWM環境で発生するようになった事象らしく、
API DwmGetWindowAttribute でウィンドウサイズを取得し、自分が期待するウィンドウサイズとの差を確認したらこの差を使って Size を再設定する、というような感じで対処できます。
複数のウィンドウを並べるなど、ウィンドウサイズを正確に扱うときに必要になるテクニックと思われます。
注意事項ですが、
・Win7などではDWMをON/OFFできるので同じPCでも状態が変わること
・7pxや14pxという値はどうやらウィンドウテーマによって変化する場合があるらしいこと
・API GetWindowAttribute はVista以降で使用可能
などがありそうです。
以上、ご確認ください。