none
ディスプレイの大きさによってWindowsフォームを変更したい RRS feed

  • 質問

  • お世話になります。Abe8888と申します。たびたび質問させてもらって助かってます。

    Windows7 32bit  Visual Studio2013 C#で開発をしております。

    デスクトップPCで開発をしていて、システムをノートPCで起動したとき解像度が違うため画面が見にくくなってしまいます。

    AutoScaleModeを全て変更して試したのですが、変わりませんでした。

    ディスプレイが変わるごとにフォームの大きさを変える処理はどのような事をすればいいのでしょうか?

    2015年10月30日 3:02

回答

  • AutoScaleModeを全て変更して試したのですが、変わりませんでした。

     AutoScaleMode は、None, Font, Dpi, Inherit です。
    None は「自動スケーリングしない」なので、これを選んでいる場合、何もおこりません。
    Font は、フォントの大きさの変更に伴ってスケーリングするモードなので、フォントの大きさが変わらなければ、スケーリングされていることがわかりません。また、フォームのフォントがデフォルトのままの場合は、正しくスケーリングされない…というバグの様な仕様が大昔にあったけど、今も残っているかどうかは知らない。ツール(C++ Builder/Delphi)固有の仕様だったかもしれない。
    Dpi は、DPI の変更に従ってスケーリングするモードなので、「デスクトップ PC」と「ノート PC」で同じ DPI が選択されていれば、スケーリングはされません。
    Inherit は「継承する」で、そのコンテナ コントロールを含んでいるコンテナ コントロールの設定に従います。最上位、つまり Form をこれに設定した場合は、デフォルトの Font になるのかな?

     「画面の解像度」などで、画面の広さ(ドット数)を選択できます。これとは別に、フォントのサイズを選択する設定があります。選択肢は、「規定のスケール」「大きなスケール」や「100%」「125%」です。この、フォントのサイズを変更すると、DPI が変わります(再起動が必要)。
    1.Windows Vista … コントロール パネル→デスクトップのカスタマイズ→個人設定→画面の設定:画面の広さ
    2.   「個人設定」の左にある「フォント サイズ(DPI)の調整:DPI の設定
    3.   コントロール パネル→デスクトップのカスタマイズ→個人設定→ウィンドウの色とデザイン→詳細な色のオプションを設定するにはクラシック スタイルの[デザイン]プロパティを開きます→詳細設定:「指定する部分」を「メッセージ ボックス」にして「フォント」を変更すると、コントロールのデフォルトのフォントが変更される。
    1.Windows 7 … コントロール パネル→デスクトップのカスタマイズ→画面の解像度の調整:画面の広さ
    2.   コントロール パネル→デスクトップのカスタマイズ→ディスプレイ:DPI の設定
    3.   コントロール パネル→デスクトップのカスタマイズ→個人設定→ウィンドウの色:「指定する部分」を「メッセージ ボックス」にして「フォント」を変更すると、コントロールのデフォルトのフォントが変更される。

     1の「画面の広さ」を変えても、フォームの大きさは追従しません。見た目の表示される面積が変わらず、画面の広さ(ドット数)が変わるのなら、解像度が変わるわけですが、Windows の解像度とディスプレイの解像度、別々に設定できると考えた方が良いでしょう。これで変えられるのは「ディスプレイの解像度」で、スケーリングには影響しません。AutoScaleMode が Dpi の場合、2の DPI の変更に追従するはずです。AutoScaleMode が Font の場合、3のフォント サイズの変更に追従するはずです。また、この場合は2であっても、デフォルトのフォント サイズが変わるので、追従するはずです。

     というわけで、何を選んだら何を元に計算するのかを把握して、それぞれの PC でどの様に設定されているか確認し、もう一度試してみてはいかがでしょうか。ノートは、ドット数が多いことを活かしたいので、DPI の設定を変えていないため、「AutoScaleModeを全て変更して試したのですが、変わりませんでした」という結果になったのではないでしょうか。


    Jitta@わんくま同盟

    • 回答の候補に設定 星 睦美 2015年11月9日 6:56
    • 回答としてマーク ABE8888 2016年2月15日 10:01
    2015年11月3日 3:49

すべての返信

  • net ディスプレイ サイズ 取得 などをキーワードにググると、ディスプレイの大きさを取得する方法が書かれた記事が多々ヒットしますが、やってみましたか? 例えば下記:

    ディスプレイの大きさ(画面の領域、解像度)を取得する
    http://dobon.net/vb/dotnet/system/displaysize.html

    それで得られた情報を利用できませんか?

    2015年10月30日 3:44
  • 一般的には、高 DPIの機能を使います。これは利用者が各々のPCでの倍率を適切に設定し、アプリケーションはそれに応じたサイズで表示されるものです。質問で触れられているAutoScaleModeも関連する設定です。

    ですので「AutoScaleModeを全て変更して試したのですが、変わりませんでした。」とのことですが、単にPCが適切に設定されていなかっただけではないでしょうか?

    2015年10月30日 4:20
  • 具体的にはどのように見にくくなっているのでしょうか? 解像度が変化した際のスケーリングは、各コントロールの実装に依存します。
    また、Windowsフォームの場合は、1ピクセルは解像度の1ピクセルと同じになります。このことは、スケーリングによって、コントロールの幅や高さのピクセルが変わることを意味しています(例えばWidthプロパティの値が変わります)。よって、これらの値を元にロジックを組んでいる場合、そのままでは動作が変わってしまう可能性があるということです。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年10月30日 4:58
    モデレータ
  • > ディスプレイが変わるごとにフォームの大きさを変える処理はどのような事をすればいいのでしょうか?

    という文章から、単純に以下のようなことをしたいのだと思っていましたが、違うのでしょうか?

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
                            
            this.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height / 2;
            this.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width / 2;
        }
    }
    

    違っていたら失礼しました。その場合、もう少し具体的にどのようにしたいのか書いていただけませんか。

    2015年10月30日 6:50
  • すみません補足です。

    画面が見にくいというのはボタンやテキストボックスが大きいディスプレイから小さいディスプレイになっても大きさが変わらないので見にくいということです。

    高DPIを使えばいいんですかね?

    みなさんから返事をもらった回答を試してみます。

    2015年10月30日 7:27
  • AutoScaleModeを全て変更して試したのですが、変わりませんでした。

     AutoScaleMode は、None, Font, Dpi, Inherit です。
    None は「自動スケーリングしない」なので、これを選んでいる場合、何もおこりません。
    Font は、フォントの大きさの変更に伴ってスケーリングするモードなので、フォントの大きさが変わらなければ、スケーリングされていることがわかりません。また、フォームのフォントがデフォルトのままの場合は、正しくスケーリングされない…というバグの様な仕様が大昔にあったけど、今も残っているかどうかは知らない。ツール(C++ Builder/Delphi)固有の仕様だったかもしれない。
    Dpi は、DPI の変更に従ってスケーリングするモードなので、「デスクトップ PC」と「ノート PC」で同じ DPI が選択されていれば、スケーリングはされません。
    Inherit は「継承する」で、そのコンテナ コントロールを含んでいるコンテナ コントロールの設定に従います。最上位、つまり Form をこれに設定した場合は、デフォルトの Font になるのかな?

     「画面の解像度」などで、画面の広さ(ドット数)を選択できます。これとは別に、フォントのサイズを選択する設定があります。選択肢は、「規定のスケール」「大きなスケール」や「100%」「125%」です。この、フォントのサイズを変更すると、DPI が変わります(再起動が必要)。
    1.Windows Vista … コントロール パネル→デスクトップのカスタマイズ→個人設定→画面の設定:画面の広さ
    2.   「個人設定」の左にある「フォント サイズ(DPI)の調整:DPI の設定
    3.   コントロール パネル→デスクトップのカスタマイズ→個人設定→ウィンドウの色とデザイン→詳細な色のオプションを設定するにはクラシック スタイルの[デザイン]プロパティを開きます→詳細設定:「指定する部分」を「メッセージ ボックス」にして「フォント」を変更すると、コントロールのデフォルトのフォントが変更される。
    1.Windows 7 … コントロール パネル→デスクトップのカスタマイズ→画面の解像度の調整:画面の広さ
    2.   コントロール パネル→デスクトップのカスタマイズ→ディスプレイ:DPI の設定
    3.   コントロール パネル→デスクトップのカスタマイズ→個人設定→ウィンドウの色:「指定する部分」を「メッセージ ボックス」にして「フォント」を変更すると、コントロールのデフォルトのフォントが変更される。

     1の「画面の広さ」を変えても、フォームの大きさは追従しません。見た目の表示される面積が変わらず、画面の広さ(ドット数)が変わるのなら、解像度が変わるわけですが、Windows の解像度とディスプレイの解像度、別々に設定できると考えた方が良いでしょう。これで変えられるのは「ディスプレイの解像度」で、スケーリングには影響しません。AutoScaleMode が Dpi の場合、2の DPI の変更に追従するはずです。AutoScaleMode が Font の場合、3のフォント サイズの変更に追従するはずです。また、この場合は2であっても、デフォルトのフォント サイズが変わるので、追従するはずです。

     というわけで、何を選んだら何を元に計算するのかを把握して、それぞれの PC でどの様に設定されているか確認し、もう一度試してみてはいかがでしょうか。ノートは、ドット数が多いことを活かしたいので、DPI の設定を変えていないため、「AutoScaleModeを全て変更して試したのですが、変わりませんでした」という結果になったのではないでしょうか。


    Jitta@わんくま同盟

    • 回答の候補に設定 星 睦美 2015年11月9日 6:56
    • 回答としてマーク ABE8888 2016年2月15日 10:01
    2015年11月3日 3:49