Udostępnij za pośrednictwem


Automatyczne skalowanie w formularzach systemu Windows

Automatyczne skalowanie umożliwia wyświetlanie formularza i jego kontrolek zaprojektowanych na jednej maszynie z określoną rozdzielczością wyświetlania lub czcionką systemową, które mają być odpowiednio wyświetlane na innej maszynie z inną rozdzielczością ekranu lub czcionką systemową. Zapewnia, że formularz i jego kontrolki będą inteligentnie zmieniane, aby były spójne z natywnymi oknami i innymi aplikacjami zarówno na komputerach użytkowników, jak i innych deweloperów. Obsługa programu .NET Framework na potrzeby automatycznego skalowania i stylów wizualizacji umożliwia aplikacjom .NET Framework zachowanie spójnego wyglądu i działania w porównaniu z natywnymi aplikacjami systemu Windows na maszynie każdego użytkownika.

W większości przypadków automatyczne skalowanie działa zgodnie z oczekiwaniami w programie .NET Framework w wersji 2.0 lub nowszej. Jednak zmiany schematu czcionek mogą być problematyczne. Aby zapoznać się z przykładem rozwiązania tego problemu, zobacz Jak: Odpowiadać na zmiany schematu czcionek w aplikacji Windows Forms.

Potrzeba automatycznego skalowania

Bez automatycznego skalowania aplikacja przeznaczona dla jednej rozdzielczości ekranu lub czcionki będzie wyświetlana za mała lub zbyt duża po zmianie rozdzielczości lub czcionki. Jeśli na przykład aplikacja została zaprojektowana przy użyciu 9 punktów Tahoma jako punktu odniesienia, bez korekty będzie ona wydawać się zbyt mała, jeśli zostanie uruchomiona na maszynie, na której czcionka systemowa to Tahoma 12 punktów. Elementy tekstowe, takie jak tytuły, menu, zawartość pola tekstowego itd., będą renderowane mniejsze niż inne aplikacje. Ponadto rozmiar elementów interfejsu użytkownika zawierających tekst, takich jak pasek tytułu, menu i wiele kontrolek, zależy od używanej czcionki. W tym przykładzie te elementy będą wyglądać na mniejsze niż zwykle.

Analogiczna sytuacja występuje, gdy aplikacja jest przeznaczona do określonej rozdzielczości ekranu. Najczęstszą rozdzielczością wyświetlania jest 96 kropek na cal (DPI), co odpowiada skalowaniu wyświetlacza 100%%, ale coraz bardziej powszechne stają się wyświetlacze o wyższej rozdzielczości obsługujące 125%%, 150%%, 200%% (które odpowiadają odpowiednio 120, 144 i 192 DPI) i więcej. Bez dostosowania aplikacja, zwłaszcza oparta na grafice, zaprojektowana pod kątem jednej rozdzielczości będzie wydawać się zbyt duża lub zbyt mała po uruchomieniu w innej rozdzielczości.

Automatyczne skalowanie ma na celu zmniejszenie tych problemów przez automatyczne zmianę rozmiaru formularza i jego kontrolek podrzędnych zgodnie z względnym rozmiarem czcionki lub rozdzielczością wyświetlania. System operacyjny Windows obsługuje automatyczne skalowanie okien dialogowych przy użyciu względnej jednostki miary nazywanej jednostkami okien dialogowych. Jednostka okna dialogowego jest oparta na czcionce systemowej, a jej relację z pikselami można określić za pomocą funkcji Win32 SDK GetDialogBaseUnits. Gdy użytkownik zmieni motyw używany przez system Windows, wszystkie okna dialogowe zostaną odpowiednio dostosowane. Ponadto program .NET Framework obsługuje automatyczne skalowanie zgodnie z domyślną czcionką systemową lub rozdzielczością wyświetlania. Opcjonalnie automatyczne skalowanie można wyłączyć w aplikacji.

Oryginalna obsługa automatycznego skalowania

Wersje 1.0 i 1.1 platformy .NET Framework obsługują automatyczne skalowanie w prosty sposób, który był zależny od domyślnej czcionki systemu Windows używanej dla interfejsu użytkownika reprezentowanej przez wartość zestawu SDK Win32 DEFAULT_GUI_FONT. Ta czcionka jest zwykle zmieniana tylko wtedy, gdy rozdzielczość wyświetlania zmieni się. Do implementowania automatycznego skalowania użyto następującego mechanizmu:

  1. W czasie projektowania właściwość AutoScaleBaseSize (która jest teraz przestarzała) została ustawiona na wysokość i szerokość domyślnej czcionki systemowej na maszynie dewelopera.

  2. W czasie wykonywania domyślna czcionka systemowa maszyny użytkownika została użyta do zainicjowania właściwości Font klasy Form.

  3. Przed wyświetleniem formularza wywołano metodę ApplyAutoScaling w celu skalowania formularza. Ta metoda obliczyła względne rozmiary skali z AutoScaleBaseSize i Font, następnie wywołała metodę Scale w celu rzeczywistego skalowania formularza i jego elementów podrzędnych.

  4. Wartość AutoScaleBaseSize została zaktualizowana, aby kolejne wywołania ApplyAutoScaling nie zmieniały rozmiaru formularza.

Chociaż ten mechanizm był wystarczający dla większości celów, wystąpiły następujące ograniczenia:

  • Ponieważ właściwość AutoScaleBaseSize reprezentuje rozmiar czcionki bazowej jako wartości całkowite, występują błędy zaokrąglania, które stają się widoczne, gdy formularz jest cyklowany przez wiele rozdzielczości.

  • Automatyczne skalowanie zostało zaimplementowane tylko w klasie Form, a nie w klasie ContainerControl. W rezultacie kontrolki użytkownika będą skalowane prawidłowo tylko wtedy, gdy kontrolka użytkownika została zaprojektowana w tej samej rozdzielczości co formularz i została umieszczona w formularzu w czasie projektowania.

  • Formularze i ich kontrolki podrzędne mogą być projektowane jednocześnie tylko przez wielu deweloperów, jeśli rozdzielczości ekranu ich komputerów są takie same. Podobnie dziedziczenie formularza zależy od rozwiązania związanego z formularzem nadrzędnym.

  • Nie jest on zgodny z nowszymi menedżerami układów wprowadzonymi w programie .NET Framework w wersji 2.0, takimi jak FlowLayoutPanel i TableLayoutPanel.

  • Nie obsługuje skalowania bezpośrednio na podstawie rozdzielczości ekranu wymaganej do zapewnienia zgodności z programem .NET Compact Framework.

Mimo że ten mechanizm jest zachowywany w programie .NET Framework w wersji 2.0 w celu zachowania zgodności z poprzednimi wersjami, został zastąpiony przez bardziej niezawodny mechanizm skalowania opisany w dalszej części. W związku z tym AutoScale, ApplyAutoScaling, AutoScaleBaseSizei niektóre przeciążenia Scale są oznaczone jako przestarzałe.

Notatka

Odwołania do tych członków można bezpiecznie usunąć podczas uaktualniania starszego kodu do programu .NET Framework w wersji 2.0.

Bieżąca obsługa automatycznego skalowania

Program .NET Framework wersja 2.0 przezwycięża poprzednie ograniczenia, wprowadzając następujące zmiany w automatycznym skalowaniu formularzy Windows:

  • Podstawowa obsługa skalowania została przeniesiona do klasy ContainerControl, dzięki czemu formularze, natywne kontrolki złożone i kontrolki użytkownika otrzymują jednolitą obsługę skalowania. Dodano nowe elementy członkowskie AutoScaleFactor, AutoScaleDimensions, AutoScaleMode i PerformAutoScale.

  • Klasa Control ma również kilku nowych członków, którzy pozwalają jej brać udział w skalowaniu i obsługę skalowania mieszanego na tym samym formularzu. W szczególności elementy członkowskie Scale, ScaleChildreni GetScaledBounds obsługują skalowanie.

  • Dodano obsługę skalowania na podstawie rozdzielczości ekranu w celu uzupełnienia obsługi czcionek systemowych zgodnie z definicją wyliczenia AutoScaleMode. Ten tryb jest zgodny z automatycznym skalowaniem obsługiwanym przez program .NET Compact Framework, co ułatwia migrację aplikacji.

  • Do implementacji automatycznego skalowania dodano zgodność z menedżerami układów, takimi jak FlowLayoutPanel i TableLayoutPanel.

  • Czynniki skalowania są teraz reprezentowane jako wartości zmiennoprzecinkowe, zazwyczaj przy użyciu struktury SizeF, dzięki czemu błędy zaokrąglania zostały praktycznie wyeliminowane.

Ostrożność

Dowolne kombinacje trybów DPI i skalowania czcionek nie są obsługiwane. Mimo że kontrolkę użytkownika można skalować przy użyciu jednego trybu (na przykład DPI) i umieścić go w formularzu przy użyciu innego trybu (czcionki) bez problemów, ale mieszanie formularza podstawowego w jednym trybie i postaci pochodnej w innym może prowadzić do nieoczekiwanych wyników.

Automatyczne skalowanie w działaniu

Formularze systemu Windows używają teraz następującej logiki do automatycznego skalowania formularzy i ich zawartości:

  1. W czasie projektowania każda ContainerControl rejestruje tryb skalowania oraz swoją aktualną rozdzielczość w AutoScaleMode i AutoScaleDimensions.

  2. W czasie wykonywania rzeczywista rozdzielczość jest przechowywana we właściwości CurrentAutoScaleDimensions. Właściwość AutoScaleFactor dynamicznie oblicza stosunek między rozdzielczością w czasie wykonywania a rozdzielczością, w której odbywa się skalowanie w czasie projektowania.

  3. Gdy formularz zostanie załadowany, jeśli wartości CurrentAutoScaleDimensions i AutoScaleDimensions są różne, metoda PerformAutoScale jest wywoływana w celu skalowania kontrolki i jej elementów podrzędnych. Ta metoda zawiesza układ i wywołuje metodę Scale w celu wykonania rzeczywistego skalowania. Następnie wartość AutoScaleDimensions jest aktualizowana w celu uniknięcia progresywnego skalowania.

  4. PerformAutoScale jest również automatycznie wywoływana w następujących sytuacjach:

    • W odpowiedzi na zdarzenie OnFontChanged, jeśli tryb skalowania jest Font.

    • Po wznowieniu układu kontrolki kontenera i wykryciu zmiany we właściwościach AutoScaleDimensions lub AutoScaleMode.

    • Gdy, jak wspomniano powyżej, skalowany jest nadrzędny ContainerControl. Każda kontrolka kontenera jest odpowiedzialna za skalowanie elementów podrzędnych przy użyciu własnych czynników skalowania, zamiast używania czynników skalowania kontenera nadrzędnego.

  5. Kontrolki podrzędne mogą modyfikować swój sposób skalowania na kilka sposobów.

    • Właściwość ScaleChildren można zastąpić, aby określić, czy ich kontrolki podrzędne powinny być skalowane, czy nie.

    • Metodę GetScaledBounds można nadpisać, aby dostosować ograniczenia, do których kontrolka jest skalowana, ale nie można zmienić logiki skalowania.

    • Metodę ScaleControl można zastąpić, aby zmienić logikę skalowania bieżącej kontrolki.

Zobacz też