2014-06-16 12 views
6

Występują problemy z poprawnym wyświetlaniem aplikacji WinForms przy ustawieniach wysokich DPI. Sprawdziłem różne witryny internetowe, a wszystkie WinFormy mają poprawną AutoScaleMode. Próbowałem ustawić to zarówno DPI i Font. Jednak formularze zawsze są odcinane w pobliżu dna, gdy używane są ustawienia wysokiej czułości (na przykład 125%).Problemy z poprawnym skalowaniem WinForm do DPI

Dodałem kod do sprawdzenia, a jeśli ustawię AutoScaleMode na DPI, to po załadowaniu formularza widzę, że AutoScaleDimensions wynosi 120,120 podczas ładowania formularza, a CurrentAutoScaleDimensions również 120,120. W pliku Form.designer.cs znajduje się wiersz do ustawienia AutoScaleDimension na 96,96.

Jeżeli ustawić AutoScaleMode do czcionki, to widzę, że w projektanta AutoScaleDimension jest prawidłowo ustawiony na nowym System.Drawing.SizeF (6F, 13F), ale po załadowaniu formularza, zarówno AutoScaleDimension i CurrentAutoScaleDimension są ustawione na 8F, 16F.

Ta aplikacja łączy niektóre WPF z WinForm, a ekrany WPF pojawiają się jako pierwsze. Tak więc na podstawie DPI Scaling in .Net 3.5 in Mixed WinForms and WPF Application próbowałem ustawić TextFormattingMode dla aplikacji, a dla ekranów WPF, które pokazują się jako pierwsze, "Display", ale nie robi to żadnej różnicy.

Jestem, szczerze mówiąc, zagubiony co do tego powodu. Przypuszczam, że mógłbym dodać kod, aby zmienić rozmiar rzeczy programowo, wykrywając DPI w czasie wykonywania, ale nie powinienem tego robić. Właściwości AutoScaleMode (i pokrewne) mają to zrobić dość automatycznie. Więc co jeszcze powinienem sprawdzić, co może spowodować ten problem?

+0

125% to nie "Wysoka czułość". WPF zdecydowanie ma wpływ, ponieważ ustawia flagę świadomą wysokiego DPI w czasie wykonywania, nawet jeśli nie jest ona ustawiona w manifeście. WinForm może być zdezorientowany, jeśli chodzi o to, czy powinien skalować, czy pozwolić, aby system operacyjny zrobił to automatycznie. –

+0

Ben, przepraszam, przypuszczam, że "wyższe DPI" może być dokładniejsze. Muszę przyjrzeć się temu bardziej szczegółowo, ponieważ problem występował nawet po zmianie aplikacji, więc nie wyświetlamy najpierw ekranów WPF. – WarnerYoung

+0

Nowoczesne ustawienia oparte na% powodują, że cały wyższy/niższy problem jest mylący. "Kropki na cal" są niższe dla większych czcionek. Ustawienia old school DPI niższe liczby zostały użyte dla wyższych czcionek, nowsze wersje Windows przyjąć standardową DPI i użyć procentowej wielkości czcionki, więc wyższa wartość jest używana dla wyższych czcionek. Zwykle mniej zagmatwane jest używanie liczb rzeczywistych niż wyższych/niższych. –

Odpowiedz

0

Czy to możliwe, że przy wielkości monitora i wyższym ustawieniu DPI ekran nie jest już wystarczająco duży, aby wyświetlić cały formularz? Mówię tak, ponieważ opracowuję aplikację WinForm o rozdzielczości 1024 x 768 i bawię się ustawieniami DPI użytkownika. Jeśli ustawię DPI na 150%, nie widzę już dolnej części formularza na monitorze, ale aplikacja skaluje się poprawnie.

+0

Dobra uwaga, Jeff, ale nie, to nie jest to, co się tutaj dzieje. Formularze są nadal wystarczająco małe, aby zmieścić się na ekranie, po prostu nie są prawidłowo dobrane. – WarnerYoung

8

Miałem podobny problem zaledwie kilka dni temu. Po kilku godzinach badań w końcu znalazłem bardzo proste rozwiązanie - dodanie do manifestu aplikacji <dpiAware>. Oto przykład z Microsoft's website.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > 
    <asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
     <dpiAware>True</dpiAware> 
    </asmv3:windowsSettings> 
    </asmv3:application> 
</assembly> 

Na moim przypadku, muszę ustawić <dpiAware> Per-monitora, aby to działało normalnie. To znaczy, zmień linię w środku na <dpiAware>Per-monitor</dpiAware>.

Różnice między każdej wartości są wymienione poniżej (Są z MSDN):

  • False - Ustawia aplikacji nie DPI świadomy.
  • True - Ustawia aplikację na system świadomy DPI.
  • Per-monitor - w systemie Windows 8.1 ustawia aplikację na DPI-monitor. W systemie Windows Vista przez Windows 8, ustawia aplikację, aby nie była świadoma DPI.
  • Prawda/PM - w systemie Windows 8.1 ustawia aplikację na monitor-DPI. W systemie Windows Vista przez Windows 8, ustawia aplikację na system-DPI świadomy.
Powiązane problemy