トップ回答者
VisualStudio2010と2013でのForm.Sizeに関して

質問
-
■開発環境
Visual Studio 2010 Pro
.NET Framework 4
vb .net
Windows7 Pro
■デザイナ設定
FormBorderStyle:FixedSingle
Size:300,300
ClientSize:294,272 ※Form.Designer.vb上の記述
■疑問点
上記の「VS2010」で作成したソースを「VS2013」で開くとデザイナ上で「Size=310,310」となり
サイズが変わっています。ClientSizeは同じです。ただ実際に実行するとウィンドウの実寸は同
じになります。Frameworkのバージョンが異なるならまだしも、ビルドするVisualStudioの
バージョンの違いで同じソースの結果が違ってくるというのは意味が分かりません。
これは通常の動作なんでしょうか?
この動作により、過去に作成した画面で動的にコントロール配置やフォームのサイズ変更を行って
いる画面があるのですが、これらのレイアウトが崩れてしまい困っています。画像が投稿できないので文字ですが実行結果としては
【VS2010】
Size:300,300
ClientSize:294,272
【VS2013】
Size:310,310
ClientSize:294,272
という値で、見た目のウィンドウサイズは同じになります。
どなたかお分かりになりますでしょうか?よろしくお願いします。
回答
-
すみません。Visual Studio上でもデバッグ時でもなく、生成された EXE のフォームサイズについて焦点を合わせていたため、ずれた回答となってしまいました。
どうも「VS2013」はデバッガを通した実行結果とexeの直接実行で「Size」の返す値が異なっているようなのですがこれは動作としてそもそもおかしい気がするのですがどうなんでしょう???
そうですね。異なる Visual Studio のバージョンで開いた時も、開発時(デバッグ時)も、EXEの直接実行時も、すべて同じサイズになるのが本当は好ましいと思います。
申し訳ないのですが、以下は解決方法ではなく、あくまでご質問の状況がなぜ起こっているかを説明したものにすぎません。
ご存知かと思いますが、フォームの Size プロパティは、クライアント領域のサイズを維持しながらタイトルバーやウィンドウの縁を含めたサイズとなっております。ですので、ご検証された通りクライアント領域のサイズは維持されているかと思います。しかしながら、タイトルバーの幅やウィンドウの縁は、OS のバージョンや設定、視覚スタイルを適用するかどうかなどに影響されます。それ以外にも FormBorderStyle = FixedSingle(サイズ変更の WS_THICKFRAME フラグが無い)の場合には EXE のサブシステムのバージョン設定によっても影響されることがあります。例えば Windows 7 ですと、FormBorderStyle = FixedSingle で、EXE に設定されているサブシステムのバージョンが 6.0 以上の場合は太い縁になり、6.0 よりも小さい場合は細い縁となるようです。
調べたところサブシステムのバージョンは下記のように設定されていました。
Visual Studio 2010 の IDE (devenv.exe) : 5.1
Visual Studio 2013 の IDE (devenv.exe) : 6.0
VS2010 の デバッグ実行時 (vshost.exe) : 4.0
VS2013 の デバッグ実行時 (vshost.exe) : 6.0
VS2010 で生成された EXE : 4.0
VS2013 で生成された EXE : 4.0
※ .NET Framework 4.0 でビルドした場合です。
上記より、Visual Studio 2013 上とデバッグ実行時では 6.0 以上になっているため、ウィンドウの縁が太く認識され、VS2013 で生成された EXE は 6.0 よりも小さいためウィンドウの縁が細くなります。.NET Framework 4.5 以上でビルドをすると生成さる EXE のサブシステムバージョンは 6.0 となるため、Visual Studio 2013 上とデバッグ時とEXEの直接実行で同じサイズとなるはずです。
私の個人的な考えですが、Visual Studio のプロパティ画面では、OS のバージョンや設定、サブシステムのバージョンにより変動する Size プロパティを設定できるのですが、Size プロパティではなく、ClientSize を設定出来たらよいのかなと思いました。ClientSize を基準に考えると、数値が変わってしまったり、レイアウトが崩れたりといったことはなくなると思います。- 編集済み kenjinoteMVP 2017年7月13日 0:47
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月13日 1:30
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年7月18日 6:28
すべての返信
-
VisualStudioの違いというよりは実行環境の違いでしょうか
以下のブログの記事が参考になるかもしれませんhttp://blog.goo.ne.jp/project_flower/e/341469f19eca7822972a9e5cce7122b1
https://ameblo.jp/satamame/entry-11556256646.html -
フォームのプロパティで FormBorderStyle = FixedSingle と設定されているときに、Visual Studio のバージョンによってサイズが変わってしまうのは、サブシステムのバージョンの違いに原因があるようです。
サブシステムのバージョンを 5.01 に設定すると、Visual Studio 2010 で作成した状態を保つことができると思います。ただ、このサブシステムのバージョンは、Visual Studio の UI 上では設定することができないようです。プロジェクトフォルダにある *.vbproj ファイルを開き、<Project> タグの中に下記のような記述をすることで設定できるようです。
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> ... 略 ... <PropertyGroup> <SubsystemVersion>5.01</SubsystemVersion> </PropertyGroup> </Project>
上記の設定を行っても Visual Studio 上のデザイナやプロパティの値には反映されませんでした、ビルドした EXE に効果があるようです。
参考サイト:
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/b8cafe78-3bcf-4ebb-b991-faea3a3e1708
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/subsystemversion-compiler-option- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月12日 0:31
-
ご返信が遅くなり申し訳ありません。
せれ様、kenjinote様。ご返信どうもありがとうございます。■せれ様へ
> VisualStudioの違いというよりは実行環境の違いでしょうか実行環境はいずれも同じ「Windows7 Pro 64bit」と同じなんです。提示しました開発環境
における実行結果でも異なってくるんです。■kenjinote様へ
ご提示いただきました「SubsystemVersion=5.01」の設定を追加して試してみました。
実効結果としては以下のようになりました。
※各値は実行時にラベルへ出力させた値であり、デザイナなどでの確認値ではありません。
・SubsystemVersion指定なし
VS2010 => Size:300,300 ClientSize:294,272
VS2013 => Size:310,310 ClientSize:294,272・SubsystemVersion=5.01
VS2010 => Size:300,300 ClientSize:294,272
VS2013 => Size:310,310 ClientSize:294,272結果としては依然として「VS2013」ではサイズが異なっています。但し実行時の画面の
見た目サイズは同じです。
ただ上記の結果はVisualStudioのデバッガを通した実行結果なのですが、これら4つのexe
を直接実行した場合は結果が全て以下となりました。Size:300,300 ClientSize:294,272
新たにテスト用のプロジェクトを作成して確認してみたのですが、どうも「VS2013」は
デバッガを通した実行結果とexeの直接実行で「Size」の返す値が異なっているようなの
ですがこれは動作としてそもそもおかしい気がするのですがどうなんでしょう???
■開発環境等をもう少し詳しく追記しておきます。
Windows7 Pro 64bit
.NET Framework 4(Full)
Visual Studio 2010 Pro Version 10.0.40219.1 SP1Rel
Visual Studio 2013 Pro Version 12.0.40629.00 Update 5
ビルドは「x86」でビルドしています。 -
すみません。Visual Studio上でもデバッグ時でもなく、生成された EXE のフォームサイズについて焦点を合わせていたため、ずれた回答となってしまいました。
どうも「VS2013」はデバッガを通した実行結果とexeの直接実行で「Size」の返す値が異なっているようなのですがこれは動作としてそもそもおかしい気がするのですがどうなんでしょう???
そうですね。異なる Visual Studio のバージョンで開いた時も、開発時(デバッグ時)も、EXEの直接実行時も、すべて同じサイズになるのが本当は好ましいと思います。
申し訳ないのですが、以下は解決方法ではなく、あくまでご質問の状況がなぜ起こっているかを説明したものにすぎません。
ご存知かと思いますが、フォームの Size プロパティは、クライアント領域のサイズを維持しながらタイトルバーやウィンドウの縁を含めたサイズとなっております。ですので、ご検証された通りクライアント領域のサイズは維持されているかと思います。しかしながら、タイトルバーの幅やウィンドウの縁は、OS のバージョンや設定、視覚スタイルを適用するかどうかなどに影響されます。それ以外にも FormBorderStyle = FixedSingle(サイズ変更の WS_THICKFRAME フラグが無い)の場合には EXE のサブシステムのバージョン設定によっても影響されることがあります。例えば Windows 7 ですと、FormBorderStyle = FixedSingle で、EXE に設定されているサブシステムのバージョンが 6.0 以上の場合は太い縁になり、6.0 よりも小さい場合は細い縁となるようです。
調べたところサブシステムのバージョンは下記のように設定されていました。
Visual Studio 2010 の IDE (devenv.exe) : 5.1
Visual Studio 2013 の IDE (devenv.exe) : 6.0
VS2010 の デバッグ実行時 (vshost.exe) : 4.0
VS2013 の デバッグ実行時 (vshost.exe) : 6.0
VS2010 で生成された EXE : 4.0
VS2013 で生成された EXE : 4.0
※ .NET Framework 4.0 でビルドした場合です。
上記より、Visual Studio 2013 上とデバッグ実行時では 6.0 以上になっているため、ウィンドウの縁が太く認識され、VS2013 で生成された EXE は 6.0 よりも小さいためウィンドウの縁が細くなります。.NET Framework 4.5 以上でビルドをすると生成さる EXE のサブシステムバージョンは 6.0 となるため、Visual Studio 2013 上とデバッグ時とEXEの直接実行で同じサイズとなるはずです。
私の個人的な考えですが、Visual Studio のプロパティ画面では、OS のバージョンや設定、サブシステムのバージョンにより変動する Size プロパティを設定できるのですが、Size プロパティではなく、ClientSize を設定出来たらよいのかなと思いました。ClientSize を基準に考えると、数値が変わってしまったり、レイアウトが崩れたりといったことはなくなると思います。- 編集済み kenjinoteMVP 2017年7月13日 0:47
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月13日 1:30
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年7月18日 6:28
-
>すみません。Visual Studio上でもデバッグ時でもなく、生成された EXE のフォームサイズについて焦点
>を合わせていたため、ずれた回答となってしまいました
とんでもありません。どうもありがとうございます。
そういう事だったんですね。現状Sizeプロパティ基準で考えているとデバッグ時と実際でどうしてもずれてしまうのですね。
とりあえずデバッグ時はしょうがないとして、現状の問題の部分はご提示頂きました方法等を考慮して
対応してみたいと思います。
今後は「Size」ではなく、「ClientSize」を基準に考えていこうと思います。本当にどうもありがとうございました。