Sdílet prostřednictvím


Automatické škálování ve Windows Forms

Automatické škálování umožňuje, aby se formulář a jeho ovládací prvky navržené na jednom počítači s určitým rozlišením zobrazení nebo systémovým písmem zobrazovaly odpovídajícím způsobem na jiném počítači s jiným rozlišením zobrazení nebo systémovým písmem. Zaručuje, že formulář a jeho ovládací prvky budou inteligentně měnit velikost tak, aby byly konzistentní s nativními okny a dalšími aplikacemi na počítačích uživatelů i jiných vývojářů. Podpora rozhraní .NET Framework pro automatické škálování a vizuální styly umožňuje aplikacím .NET Framework udržovat konzistentní vzhled a chování v porovnání s nativními aplikacemi systému Windows na počítači každého uživatele.

Ve většině případů automatické škálování funguje podle očekávání v rozhraní .NET Framework verze 2.0 a novější. Změny schématu písem ale můžou být problematické. Příklad řešení tohoto problému najdete v tématu Postupy: Reakce na změny schématu písem v aplikaci Windows Forms.

Potřeba automatického škálování

Bez automatického škálování se aplikace navržená pro jedno rozlišení zobrazení nebo písmo při změně rozlišení nebo písma zobrazí příliš malá nebo příliš velká. Pokud je například aplikace navržena pomocí Tahoma 9 bodů jako základ, bez úprav se bude zobrazovat příliš malá, pokud běží na počítači, kde je systémovým písmem Tahoma 12 bodů. Textové prvky, jako jsou názvy, nabídky, obsah textového pole a podobně, se zobrazí menší než v jiných aplikacích. Velikost prvků uživatelského rozhraní(UI), které obsahují text, například záhlaví, nabídky a mnoho ovládacích prvků, závisí na použitém písmu. V tomto příkladu se tyto prvky zobrazí také relativně menší.

Analogická situace nastane, když je aplikace navržena pro určité rozlišení zobrazení. Nejběžnější rozlišení displeje je 96 bodů na palec (DPI), což odpovídá měřítku zobrazení 100%. Displeje s vyšším rozlišením, které podporují 125%, 150%, 200% (což se rovná 120, 144 a 192 DPI) a vyšší, jsou stále běžnější. Bez úprav se aplikace, zejména ta, která je založená na grafice, navržená pro jedno rozlišení, zobrazí buď jako příliš velká nebo jako příliš malá, když je spuštěna na jiném rozlišení.

Automatické škálování se snaží tyto problémy zmírnit automatickou změnou velikosti formuláře a jeho podřízených ovládacích prvků podle relativní velikosti písma nebo rozlišení zobrazení. Operační systém Windows podporuje automatické škálování dialogových oken pomocí relativní měrné jednotky označované jako jednotky dialogových oken. Jednotka dialogového okna je založena na systémovém písmu a její vztah k pixelům lze určit pomocí funkce Win32 SDK GetDialogBaseUnits. Když uživatel změní motiv používaný systémem Windows, všechna dialogová okna se automaticky upraví odpovídajícím způsobem. Rozhraní .NET Framework navíc podporuje automatické škálování podle výchozího systémového písma nebo rozlišení zobrazení. Volitelně je možné automatické škálování zakázat v aplikaci.

Původní podpora automatického škálování

Verze 1.0 a 1.1 rozhraní .NET Framework podporovaly automatické škálování jednoduchým způsobem, který byl závislý na výchozím písmu Windows používaném pro uživatelské rozhraní, reprezentované hodnotou sady Win32 SDK DEFAULT_GUI_FONT. Toto písmo se obvykle mění jenom v případě, že se změní rozlišení zobrazení. K implementaci automatického škálování se použil následující mechanismus:

  1. V době návrhu byla vlastnost AutoScaleBaseSize (která je nyní zastaralá) nastavena na výšku a šířku výchozího systémového písma na počítači vývojáře.

  2. Za běhu se k inicializaci vlastnosti Font třídy Form použilo výchozí systémové písmo počítače uživatele.

  3. Před zobrazením formuláře byla volána metoda ApplyAutoScaling pro škálování formuláře. Tato metoda vypočítala relativní velikosti měřítka z AutoScaleBaseSize a Font, pak volala metodu Scale pro skutečné škálování formuláře a jeho podřazených objektů.

  4. Hodnota AutoScaleBaseSize byla aktualizována tak, aby následná volání ApplyAutoScaling nevytvořila postupně změnu velikosti formuláře.

I když byl tento mechanismus pro většinu účelů dostatečný, došlo k následujícím omezením:

  • Vzhledem k tomu, že vlastnost AutoScaleBaseSize představuje základní velikost písma jako celočíselné hodnoty, dochází k chybám zaokrouhlení, které se projeví při přepínání mezi několika rozlišeními.

  • Automatické škálování bylo implementováno pouze v Form třídě, nikoli ve třídě ContainerControl. V důsledku toho by uživatelské ovládací prvky správně škálovaly pouze tehdy, když byl uživatelský ovládací prvek navržen ve stejném rozlišení jako formulář a byl umístěn ve formuláři v době návrhu.

  • Formuláře a podřízené ovládací prvky můžou být současně navrženy více vývojáři, pokud by jejich rozlišení počítačů bylo stejné. Podobně také dědičnost určitého formuláře závisí na rozlišení spojeném s nadřazeným formulářem.

  • Není kompatibilní s novějšími správci rozložení zavedenými v rozhraní .NET Framework verze 2.0, jako jsou FlowLayoutPanel a TableLayoutPanel.

  • Nepodporuje škálování přímo na základě rozlišení displeje, které je vyžadováno pro kompatibilitu s rozhraním .NET Compact Framework.

I když je tento mechanismus zachován v rozhraní .NET Framework verze 2.0 kvůli zachování zpětné kompatibility, nahradil ho robustnější mechanismus škálování popsaný dále. V důsledku toho jsou AutoScale, ApplyAutoScaling, AutoScaleBaseSizea určitá přetížení Scale označena jako zastaralá.

Poznámka

Odkazy na tyto členy můžete bezpečně odstranit při upgradu starší verze kódu na rozhraní .NET Framework verze 2.0.

Aktuální podpora automatického škálování

Rozhraní .NET Framework verze 2.0 přepojí předchozí omezení zavedením následujících změn automatického škálování modelu Windows Forms:

  • Základní podpora škálování byla přesunuta do třídy ContainerControl tak, aby formuláře, nativní složené ovládací prvky a uživatelské ovládací prvky obdržely podporu jednotného škálování. Přidali jsme nové členy AutoScaleFactor, AutoScaleDimensions, AutoScaleMode a PerformAutoScale.

  • Třída Control má také několik nových členů, které jí umožňují účastnit se škálování a podporovat smíšené škálování ve stejném formuláři. Konkrétně Scale, ScaleChildrena GetScaledBounds členy podporují škálování.

  • Byla přidána podpora škálování na základě rozlišení obrazovky, která doplňuje podporu systémových písem, jak je uvedeno v AutoScaleMode výčtu. Tento režim je kompatibilní s automatickým škálováním podporovaným rozhraním .NET Compact Framework a umožňuje snadnější migraci aplikací.

  • Do implementace automatického škálování byla přidána kompatibilita s správci rozložení, jako jsou FlowLayoutPanel a TableLayoutPanel.

  • Škálovací faktory jsou nyní reprezentovány jako hodnoty s plovoucí desetinnou čárkou, obvykle pomocí struktury SizeF, takže chyby zaokrouhlování byly téměř úplně eliminovány.

Opatrnost

Nepodporují se libovolné kombinace režimů DPI a škálování písma. I když můžete uživatelský ovládací prvek škálovat pomocí jednoho režimu (například DPI) a umístit ho do formuláře pomocí jiného režimu (písmo) bez problémů, ale kombinování základního formuláře v jednom režimu a odvozené formuláře v jiném může vést k neočekávaným výsledkům.

Automatické škálování v akci

Windows Forms teď používá následující logiku k automatickému škálování formulářů a jejich obsahu:

  1. Při návrhu každý ContainerControl zaznamenává režim škálování a své aktuální rozlišení v AutoScaleMode a AutoScaleDimensions.

  2. V době běhu je skutečné rozlišení uloženo ve vlastnosti CurrentAutoScaleDimensions. Vlastnost AutoScaleFactor dynamicky vypočítá poměr mezi rozlišením škálování za běhu a rozlišením při návrhu.

  3. Při načtení formuláře, pokud se hodnoty CurrentAutoScaleDimensions a AutoScaleDimensions liší, zavolá se metoda PerformAutoScale pro škálování ovládacího prvku a jeho dílčích částí. Tato metoda pozastaví rozložení a zavolá metodu Scale k provedení skutečného škálování. Následně se aktualizuje hodnota AutoScaleDimensions, aby se zabránilo progresivnímu škálování.

  4. PerformAutoScale se také automaticky vyvolá v následujících situacích:

    • V reakci na událost OnFontChanged, pokud je režim škálování Font.

    • Když se rozložení ovládacího prvku kontejneru obnoví a ve vlastnostech AutoScaleDimensions nebo AutoScaleMode se zjistí změna.

    • Jak vyplývá z výše uvedeného, když se nadřazený ContainerControl škáluje. Každý ovládací prvek kontejneru zodpovídá za škálování podřízených položek pomocí vlastních faktorů škálování a ne toho z nadřazeného kontejneru.

  5. Podřízené ovládací prvky můžou měnit chování škálování několika způsoby:

    • Vlastnost ScaleChildren lze přepsat, aby bylo možné určit, jestli mají být jejich podřízené ovládací prvky škálovány nebo ne.

    • Metodu GetScaledBounds lze přepsat tak, aby se upravily hranice, na které se ovládací prvek škáluje, ale ne na logiku škálování.

    • Metodu ScaleControl lze přepsat, aby se změnila logika škálování pro aktuální ovládací prvek.

Viz také