Winforms i DpiAware

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.

0

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

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();
    }
0

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

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ę.

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.

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.

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

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.

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