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 sposobu rozwiązania tego problemu, zobacz How to: Respond to Font Scheme Changes in a Windows Forms Application (Jak reagować na zmiany schematu czcionek w aplikacji formularzy systemu Windows).

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ą również wyświetlane stosunkowo mniejsze.

Analogiczna sytuacja występuje, gdy aplikacja jest przeznaczona do określonej rozdzielczości ekranu. Najczęściej spotykana rozdzielczość ekranu to 96 kropek na cal (DPI), co równa się 100% skalowania ekranu, ale wyższa rozdzielczość wyświetla obsługę 125%, 150%, 200% (co jest odpowiednio równe 120, 144 i 192 DPI) i nowsze są coraz bardziej powszechne. 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 czcionki systemowej, a jej relację z pikselami można określić, choć funkcja GetDialogBaseUnitszestawu SDK Win32 . 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 AutoScaleBaseSize projektowania właściwość (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 Font właściwości Form klasy.

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

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

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

  • AutoScaleBaseSize Ponieważ właściwość 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 Form w klasie, a nie w ContainerControl klasie. 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 ich rozwiązania maszynowe były takie same. Podobnie dziedziczenie formularza jest zależne od rozpoznawania skojarzonego z formularzem nadrzędnym.

  • Nie jest on zgodny z nowszymi menedżerami układów wprowadzonymi w programie .NET Framework w wersji 2.0, na przykład 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 AutoScalez tym niektóre przeciążenia , ApplyAutoScalingAutoScaleBaseSize, i Scale są oznaczone jako przestarzałe.

Uwaga

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 w wersji 2.0 odinstaluje poprzednie ograniczenia, wprowadzając następujące zmiany w automatycznym skalowaniu formularzy systemu Windows:

  • Obsługa skalowania podstawowego ContainerControl została przeniesiona do klasy, aby formularze, natywne kontrolki złożone i kontrolki użytkownika otrzymywały jednolitą obsługę skalowania. Dodano nowych członków AutoScaleFactor, AutoScaleDimensionsAutoScaleMode i PerformAutoScale .

  • Klasa Control ma również kilka nowych elementów członkowskich, które umożliwiają jej uczestnictwo w skalowaniu i obsługę skalowania mieszanego w tym samym formularzu. W szczególności Scaleelementy członkowskie ScaleChildren, i 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.

  • Zgodność z menedżerami układów, takimi jak FlowLayoutPanel i TableLayoutPanel została dodana do implementacji automatycznego skalowania.

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

Uwaga

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 z nich ContainerControl rejestruje odpowiednio tryb skalowania i bieżącą rozdzielczość w systemach AutoScaleMode i AutoScaleDimensions.

  2. W czasie wykonywania rzeczywista rozdzielczość jest przechowywana we CurrentAutoScaleDimensions właściwości . Właściwość AutoScaleFactor dynamicznie oblicza stosunek między rozdzielczością skalowania w czasie wykonywania i czasie projektowania.

  3. Gdy formularz zostanie załadowany, jeśli wartości CurrentAutoScaleDimensions i AutoScaleDimensions są różne, PerformAutoScale metoda 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ść parametru AutoScaleDimensions jest aktualizowana w celu uniknięcia progresywnego skalowania.

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

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

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

    • Jak pokazano powyżej, gdy element nadrzędny ContainerControl jest skalowany. Każda kontrolka kontenera jest odpowiedzialna za skalowanie elementów podrzędnych przy użyciu własnych czynników skalowania, a nie z kontenera nadrzędnego.

  5. Kontrolki podrzędne mogą modyfikować zachowanie skalowania za pomocą kilku sposobów:

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

    • Metodę GetScaledBounds można przesłonić, aby dostosować granice, do których jest skalowana kontrolka, ale nie logika skalowania.

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

Zobacz też