2016-10-25 3 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 %로 설정 한 모니터에 건물.
  • Visual Studio의 디자이너에서 양식을 빌드하는 것과 순수한 C# 코드로 작성하는 것. 비주얼 스튜디오 2015

  • 닷넷 4.0 대 닷넷 4.6.1
  • 비주얼 스튜디오 2010 난 단지 내 문제를 해결 한 가지를 발견했다. 불행히도 나는 이것을 목표로하고있는 기계에서, 내가 이것을 만들고있는 기계에서하지 말아야했다. 따라서 실제적인 해결책은 아닙니다. 자세한 내용은 "반복 단계"아래의 두 번째 항목을 참조하십시오.

    단계 반복 :

    • 이 형태의 많은에 컨트롤이 많이 발생합니다. 작고 간단한 데모는 아래 코드 샘플을 참조하십시오. 그것이 위의 스크린 샷을 얻은 방법입니다.
    • 하나의 시스템 설정으로이 문제가 나타나거나 사라질 수 있습니다. 주 모니터를 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

    예, 텍스트 상자와 목록 상자에는 글꼴 크기가 하나 있으며 단추와 레이블의 글꼴 크기가 다릅니다. 그들은 모두 같은 크기 여야합니다. –

    답변

    0

    이건 미친 짓이지만 작동합니다.

    DPI 가상화에 대해 인터넷에서 본 모든 내용은 기본적으로 PROCESS_DPI_UNAWARE 프로세스가 자동으로 설정됩니다. 따라서 다른 두 설정 중 하나를 명시 적으로 선택하지 않으면 응용 프로그램이 고해상도 모니터에서보기 좋게 표시되어야합니다. 약간 퍼지기는하지만 위의 예와 같이 나쁘지 않아야합니다.

    분명히 그게 이 아니라입니다. 기본값은 컴퓨터에 따라 다르며 날짜에 따라 다릅니다. 내 솔루션 : 명시 적으로 PROCESS_DPI_UNAWARE를 사용하도록 응용 프로그램을 설정하십시오. 아래 코드 샘플을 포함 시켰습니다.

    매니페스트를 사용하여이 문제를 처리 할 수 ​​있어야합니다. 일부 소식통은 C# 코드를 사용하는 대신 선호하는 방법이라고 말합니다. 우리는 그것과 결과가 엇갈 렸습니다. C# 코드 옵션이 더 안정적으로 보입니다.

    이것은 여러 가지 다른 개발자 컴퓨터에서 작동합니다. 우리는 베타 테스터에게 픽스를 보내기 시작할 것입니다.

    요약

    1. 오는/S는 높은 DPI 시스템에서 실행 된 프로그램에 대한 호환성 모드를 제공합니다.
    2. WinForms와 O/S는 시스템 또는 현재 모니터의 DPI에 따라 컨트롤의 크기를 수동으로 변경하기위한 도구를 제공합니다.
    3. # 1과 # 2 모두 심각하게 버그가 있습니다!
    4. 세부 사항은 한 컴퓨터에서 다음 컴퓨터까지 다양합니다.
    5. 고정 # 2 더 많은 것입니다 강력한 옵션,하지만 지금까지 그것은 고칠 수 없다는 것을 알 수 있습니다.
    6. 대신 # 1이 수정되었습니다. 그것은 합리적으로 잘 작동합니다.
    관련 문제