Winforms i DpiAware

Odpowiedz Nowy wątek
2019-03-09 11:39
0

Czy można napisać aplikację tak, aby wyglądała identycznie wszędzie jak w WPF? Jak ustawię dpi aware, to przy skalowaniu windows jest super, a bez skalowania jest kilka razy większe i nieczytelne. Niestety nie można chyba wykryć czy skalowanie jest włączone i czy użyć dpi aware.

Pozostało 580 znaków

2019-03-10 09:12
0

"Bez skalowania jest większe" - to nienormalne. Opisz w jaki sposób "ustawiasz dpi aware" i o jakich wartościach dpi mówimy.

Pozostało 580 znaków

2019-03-10 14:05
0

Już chyba wiem.
Wiesz co, projektowałem to na urządzeniu ze skalowaniem Windows 150% i VisualStudio automatycznie przeproporcjonowało wymiary i dlatego na urządzeniu bez skalowania było większe.
Teraz już jest okej, bo zrobiłem test projektując na urządzeniu bez skalowania i rozmiar okna jest identyczny, ale czcionki są mniejsze na urządzeniu ze skalowaniem. Nienaturalnie mniejsze. Musiałbym chyba wyłapać czy jest włączone skalowanie i pozmieniać czcionki, ale nie wiem czy jest możliwe to sprawdzić.

Ustawiam tak:

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            SetProcessDPIAware(); // TU

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool SetProcessDPIAware();
    }

Pozostało 580 znaków

2019-03-12 08:38
0

@Azarien: Coś robię nie tak czy może tak już musi być bo taki urok tego rozwiązania w tym frameworku?

Pozostało 580 znaków

2019-03-12 08:39
1

A stosowałeś się do tego?:

https://docs.microsoft.com/en[...]-dpi-support-in-windows-forms

Pozostało 580 znaków

2019-03-12 08:43
0

Kiedyś tego używałem, ale nie testowałem aż tak na szerokim polu. Zakładałem, że to to samo, tylko w mniej przystępny sposób. Masz racje, warto by było przetestować. Sprawdzę. Dzięki za sugestię.

Pozostało 580 znaków

2019-03-12 09:29
0

Niestety tak samo.

Od biedy może być, jest to czytelne, ale może już czas się oznajmić z tym WPF, MVVM i XAML.

Pozostało 580 znaków

2019-03-12 13:17
1

Mało podajesz szczegółów co robisz i jak to wygląda. Może daj screenshoty.
Nie sugeruj się też tym jak forma wygląda w designerze pod VS, tylko jak po uruchomieniu programu.

Pozostało 580 znaków

2019-03-14 22:05
2

Zrobiłem mały test.

Windows 10 wersja 1803, 32-bitowa.
Visual Studio 2017 (15.9.9)
Nowa aplikacja Windows Forms, wersja Frameworka 4.7.2 (powinna być minimum 4.7)

Dodałem manifest, odkomentowałem linijkę z supportedOS dla Windows 10.
Dodałem wpis do App.config zgodnie z instrukcją pod linkiem powyżej.

Wrzuciłem kilka kontrolek na formę. Niektóre skalują się prawidłowo (bez rozmycia), niektóre niestety nie chcą automatycznie się skalować.
Przykładowo TextBox albo ListBox.
Nie wiem jakie jest zalecane rozwiązanie, ale wymyśliłem coś takiego:

        private void textBox1_DpiChangedBeforeParent(object sender, EventArgs e)
        {
            var control = sender as Control;
            control.Font = new Font(control.Font.Name, (float)control.DeviceDpi / 96 * 8);
        }

gdzie 8 to intendowany rozmiar fonta. Powinien się zgadzać z ustawionym dla danej kontrolki w designerze. Można by go pobierać na starcie aplikacji do pola w klasie.

Ponadto w Labelach musiałem wyłączyć AutoSize bo nie działa prawidłowo.

Efekt:

DPI = 96 (czyli "100%")

100.png

DPI = 120 (czyli "125%")

125.png

  • 125.png (0,01 MB) - ściągnięć: 1
  • 100.png (0 MB) - ściągnięć: 0
Przy okazji przydaje się posiadanie dwóch monitorów - można ustawić im różne DPI i po prostu przesuwać okno z jednego monitora na drugi. Aplikacja powinna reagować na bieżąco. - Azarien 2019-03-14 22:08
wciąż nie jest do końca OK jeśli program się otworzy bezpośrednio na ekranie z wysokim DPI, w przeciwieństwie do przesunięcia na ekran z wysokim DPI (tak jak to robiłem). ale nie mam na razie ochoty dalej przy tym grzebać... - Azarien 2019-03-15 08:57

Pozostało 580 znaków

2019-03-15 12:30
0

Szanuję za włożoną pracę.

Podobno taką aplikację trzebą pisać na tablelayout i na dockach, i każdy kontrolka ma mieć AutoSizeMode: GrowAndShrink, a Forma ma mieć również AutoScaleMode: DPI.
A te całe ustawianie DPIAware w kodzie, to jest to samo, co we właściwościach exe kliknąć wspieranie DPI przez aplikacje w ustawieniach kompatybilności.

Niestety chwilowo zostałem z samym urządzeniem z włączonym skalowaniem, a drugiego monitora nie mam, więc nie mogę przetestować.

Póki co te całe DpiAware jest niepoważne na WinForms i nie nadaję się do profesjonalnych rozwiązań, ale moze też po prostu my nie umiemy napisać dobrze tej aplikacji.

Pokaż pozostałe 10 komentarzy
Ale czy Microsoft by wypuścił takie rozwiazanie? Powinno wszystko działać. Wszystkie kontrolki. Może to przez pozycjonowanie absolutne? Nie wierzę, że trzeba ręcznie połowe kontrolek ustawiać. Spróbuję jak będę miał narzędzia pozwalające na to. Trudne to może nie, ale jak to wygląda? Bardziej jak trick, niż możliwości technologii. - Pamik 2019-03-15 14:50
Poza tym "wciąż nie jest do końca OK jeśli program się otworzy bezpośrednio na ekranie z wysokim DPI, w przeciwieństwie do przesunięcia na ekran z wysokim DPI (tak jak to robiłem)." - to też trzeba rozwiązać. - Pamik 2019-03-15 14:51
dziwne jest pytanie czy "Microsoft by wypuścił", skoro wypuścił. - Azarien 2019-03-15 14:56
Nie wiem czy takie wypuścił czy po prostu zapomniał dodać jak ustawić komponenty aby się skalowały : P - Pamik 2019-03-15 17:42
A jakby wykluczyć skalowanie, to wszystko powinno wyświetlać się poprawnie na naturalnych dla monitora rozdzieczlościach UHD itd? Problemem jest samo skalowanie? Nie znam się na tych sprawach technicznych. - Pamik 2019-03-15 17:45

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0