2016-10-25 29 views
2

古いシステムではうまく動作するWinFormsアプリケーションがありますが、4kモニターで見栄えが良くなりません。複数の問題があり、そのテーマにはたくさん書かれていますが、この質問は特定の問題に焦点を当てています。私は同じフォントを使用するために異なるコントロールを設定することができますが、高いDPIシステムではコントロールが大きく異なって見えます。これをどうすれば解決できますか?高解像度のDPIモニタでは、同じフォントが同じに見えない

明らかに、私はフォントサイズを変更したり、コントロールを動かしたりすることができます。しかし、Windowsはフォントサイズに不思議な要素を追加しています。 Windowsが何をしているのかわからなければ、元に戻すのは難しいです!古いシステムで

は私のテストウィンドウが完璧に見える:私は「

Requested font size does not match visible font size.

高DPIシステムで

All controls have the same font size.

は、いくつかのコントロールが他とは異なるフォントサイズを持っていますフォームから継承するのではなく、いくつかのコントロールで手動でフォントを設定するなど、いくつかのことを試してみました。これを含め修正するために、私はいくつかのことを試してみた、インターネットを検索した後

enter image description here

:あなたが見ることができるように、フォントを変更しても問題が解決しなかった

  • PROCESS_DPI_UNAWAREの間でアプリケーションを変更し、 PROCESS_SYSTEM_DPI_AWARE、PROCESS_PER_MONITOR_DPI_AWARE
  • フォームのフォントを使用するのではなく、changing the fontを明示的に使用します。
  • 古いシステムと高DPIシステムのビルディングのビルド。
  • 同じコンピュータ上の192 DPI/200%に設定されたモニタで96 DPI/100%に設定されたモニタにビルドします。
  • ビジュアルスタジオのデザイナーでフォームをビルドすることと、それを純粋なC#コードでビルドすること。
  • .NET 4.0
  • 4.6.1純対のVisual Studio 2010のVisual StudioのVS 2015

私は私の問題を修正し、一つのことを発見しました。残念なことに、私はターゲットマシン上でそれを実行しなければなりませんでした。だから実用的な解決策ではありません。詳細については、「繰り返す手順」の2番目の項目を参照してください。繰り返す

ステップ:

  • これは、フォームの多くのコントロールの多くで発生します。小さくてシンプルなデモについては、下のコードサンプルを参照してください。それが上のスクリーンショットを手に入れた方法です。
  • この問題は、1つのシステム設定で表示または消滅させることができます。メインモニタを96 DPI/100%スケーリングに変更した場合、を再起動し、を再起動すると、すべてのフォントが要求通りに良好な結果が得られます。メインモニタを別のDPI設定()に変更してからを再起動すると、不正な結果が表示されます。

    private void newFormButton_Click(object sender, EventArgs e) 
    { 
        Font copyOfFont = new Font(Font, FontStyle.Strikeout); 
        Form form = new Form(); 
        form.Font = Font; 
        string sample = "Abc 123 :)"; 
        int padding = 6; 
        Label label = new Label(); 
        label.Text = sample; 
        label.Top = padding; 
        label.Left = padding; 
        label.Font = copyOfFont; 
        label.Parent = form; 
        Button button = new Button(); 
        button.Text = sample; 
        button.Top = label.Bottom + padding; 
        button.Left = padding; 
        button.Width = label.Width + padding * 2; 
        button.Height = label.Height + padding * 2; 
        button.Parent = form; 
        TextBox textBox = new TextBox(); 
        textBox.Text = sample; 
        textBox.Size = button.Size; 
        textBox.Top = button.Bottom + padding; 
        textBox.Left = padding; 
        textBox.Parent = form; 
        ListBox listBox = new ListBox(); 
        listBox.Items.Add(sample); 
        listBox.Items.Add(sample); 
        listBox.Width = button.Width; 
        listBox.Height = button.Height * 2; 
        listBox.Top = textBox.Bottom + padding; 
        listBox.Left = padding; 
        listBox.Font = copyOfFont; 
        listBox.Parent = form; 
        form.Show(); 
    } 
    
+0

テキストボックスのフォントサイズがHiDPIの例のラベルと異なるのは、あなたですか? – kristianp

+0

はい、テキストボックスとリストボックスは1つのフォントサイズを持ち、ボタンとラベルのフォントサイズは異なります。それらはすべて同じサイズでなければなりません。 –

答えて

0

これはクレイジーですが、それは動作します。

DPI仮想化についてインターネット上で見たことはすべて、WindowsはデフォルトでPROCESS_DPI_UNAWAREに自動的にプロセスを設定すると言います。したがって、明示的に他の2つの設定のいずれかを選択しない限り、アプリケーションは高解像度のモニターでうまく見えるはずです。それはちょっとあいまいかもしれませんが、上に示した例ほど悪くはありません。

明らかに、それはではなく、です。デフォルトはコンピュータによって異なり、日によって異なります。私の解決策:明示的には、PROCESS_DPI_UNAWAREを使用するようにアプリケーションを設定します。私は以下のコードサンプルを含んでいます。

マニフェストを使用してこれを処理できるはずです。いくつかの情報源は、C#コードを使用するのではなく、それが好ましい方法だと言います。私たちはその結果とそれを混ぜ合わせました。 C#コードオプションはより信頼できるようです。

これは、数多くの異なる開発者マシンで動作します。ベータテスト担当者に修正を送ろうとしています。

概要

  1. O/Sは、高DPIシステム上で実行されている古いプログラムの互換モードを提供します。
  2. WinFormsとO/Sは、システム または現在のモニタのDPIに応じて、コントロールのサイズを手動で変更するツールを提供します。
  3. #1と#2はともに重大なバグです!
  4. 詳細はコンピュータごとに大きく異なります。
  5. #2を固定することは、より多くの 強力なオプションですが、限り私はそれが を修正することは不可能と言うことができます。
  6. 代わりに#1を修正しました。それは合理的にうまくいく。
関連する問題