Automatické škálování v model 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í najdete v tématu Postupy: Reakce na změny schématu písem v aplikaci model 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 bodu jako směrného plánu, bez úpravy se zobrazí příliš malá, pokud běží na počítači, kde je systémové písmo Tahoma 12 bod. Textové prvky, jako jsou názvy, nabídky, obsah textového pole atd., se vykreslí menší než jiné aplikace. 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), které se rovná 100% měřítku zobrazení, ale vyšší rozlišení podporuje 125 %, 150 %, 200 % (což se v uvedeném pořadí rovná 120, 144 a 192 DPI) a vyšší jsou stále častější. Bez úprav se aplikace, zejména grafika, navržená pro jedno rozlišení, zobrazí příliš velký nebo příliš malý při spuštění v 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 jeho vztahu k pixelům lze určit, i když funkce GetDialogBaseUnitsWin32 SDK . 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 AutoScaleBaseSize byla vlastnost (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 Font vlastnosti Form třídy použilo výchozí systémové písmo počítače uživatele.

  3. Před zobrazením formuláře ApplyAutoScaling byla volána metoda 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řízených položek.

  4. Hodnota AutoScaleBaseSize byla aktualizována tak, aby následná volání ApplyAutoScaling neproběhla postupně měnit velikost 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 AutoScaleBaseSize vlastnost představuje velikost základního písma jako celočíselné hodnoty, dochází k chybám zaokrouhlení, které se projeví, když je formulář cyklicky cyklicky přes více rozlišení.

  • Automatické škálování bylo implementováno pouze Form ve třídě, nikoli ve ContainerControl třídě. 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 formuláře závisela 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, například 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 , AutoScale, ApplyAutoScalingAutoScaleBaseSizea určité Scale přetížení jsou označeny 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í model Windows Forms:

  • Základní podpora škálování byla přesunuta do ContainerControl třídy, aby formuláře, nativní složené ovládací prvky a uživatelské ovládací prvky obdržely podporu jednotného škálování. Nové členy AutoScaleFactora AutoScaleDimensionsAutoScaleModePerformAutoScale byly přidány.

  • 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ě , ScaleScaleChildrena GetScaledBounds členové 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 definováno výčtem AutoScaleMode . 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í.

  • K implementaci automatického škálování byla přidána kompatibilita se správci rozložení, jako FlowLayoutPanel je a TableLayoutPanel byla přidána.

  • Faktory škálování jsou nyní reprezentovány jako hodnoty s plovoucí desetinou čárkou, obvykle pomocí SizeF struktury, takže chyby zaokrouhlení byly prakticky eliminovány.

Upozornění

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

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

  1. V době návrhu každý ContainerControl zaznamenává režim škálování a aktuální rozlišení v AutoScaleModeAutoScaleDimensionsa v uvedeném pořadí.

  2. V době běhu se skutečné rozlišení uloží do CurrentAutoScaleDimensions vlastnosti. Vlastnost AutoScaleFactor dynamicky vypočítá poměr mezi řešením škálování za běhu a návrhem.

  3. Při načtení formuláře, pokud hodnoty CurrentAutoScaleDimensions a AutoScaleDimensions jsou odlišné, pak PerformAutoScale metoda je volána ke škálování ovládacího prvku a jeho podřízených položek. Tato metoda pozastaví rozložení a zavolá metodu Scale k provedení skutečného škálování. Následně se hodnota aktualizuje, aby se zabránilo postupnému AutoScaleDimensions škálování.

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

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

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

    • Jak je uvedeno výše, když se škáluje nadřazený ContainerControl objekt. Každý ovládací prvek kontejneru zodpovídá za škálování podřízených položek pomocí vlastních faktorů škálování, nikoli za to, co pochází z nadřazeného kontejneru.

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

    • ScaleChildren Vlastnost lze přepsat, aby bylo možné určit, zda 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é