Delen via


Automatisch schalen in Windows Forms

Met automatisch schalen kunnen een formulier en de bijbehorende besturingselementen, ontworpen op één computer met een bepaalde weergaveresolutie of systeemlettertype, op de juiste wijze worden weergegeven op een andere computer met een andere weergaveresolutie of een ander systeemlettertype. Het zorgt ervoor dat het formulier en de bijbehorende besturingselementen op intelligente wijze worden aangepast aan systeemeigen vensters en andere toepassingen op zowel de computers van gebruikers als andere ontwikkelaars. Dankzij de ondersteuning van .NET Framework voor automatische schaalaanpassing en visuele stijlen kunnen .NET Framework-toepassingen een consistent uiterlijk behouden in vergelijking met systeemeigen Windows-toepassingen op de computer van elke gebruiker.

Voor het grootste deel werkt automatisch schalen zoals verwacht in .NET Framework versie 2.0 en hoger. Wijzigingen in lettertypeschema's kunnen echter problematisch zijn. Zie Antwoorden op wijzigingen in lettertypeschema's in een Windows Forms-toepassingvoor een voorbeeld van hoe u dit kunt oplossen.

Behoefte aan automatisch schalen

Zonder automatisch schalen wordt een toepassing die is ontworpen voor één weergaveresolutie of lettertype, te klein of te groot weergegeven wanneer die resolutie of dat lettertype wordt gewijzigd. Als de toepassing bijvoorbeeld is ontworpen met Tahoma 9-punt als basislijn, wordt deze zonder aanpassing te klein weergegeven als deze wordt uitgevoerd op een computer waarop het systeemlettertype Tahoma 12 punt is. Tekstelementen, zoals titels, menu's, inhoud van tekstvak, enzovoort, worden kleiner dan andere toepassingen. Bovendien zijn de grootte van gebruikersinterface-elementen die tekst bevatten, zoals de titelbalk, menu's en veel besturingselementen, afhankelijk van het gebruikte lettertype. In dit voorbeeld worden deze elementen ook relatief kleiner weergegeven.

Een analoge situatie treedt op wanneer een toepassing is ontworpen voor een bepaalde beeldschermresolutie. De meest voorkomende weergaveresolutie is 96 punten per inch (DPI), die gelijk is aan 100% schermschaal, maar een hogere resolutie geeft ondersteuning voor 125%, 150%, 200% (die respectievelijk gelijk zijn aan 120, 144 en 192 DPI) en hoger worden steeds vaker gebruikt. Zonder aanpassing zal een toepassing, met name een op afbeeldingen gebaseerde toepassing, die is ontworpen voor één resolutie, te groot of te klein worden weergegeven wanneer deze op een andere resolutie wordt uitgevoerd.

Automatisch schalen probeert deze problemen te verhelpen door het formaat van het formulier en de onderliggende bedieningselementen automatisch te wijzigen op basis van de relatieve tekengrootte of weergaveresolutie. Het Windows-besturingssysteem ondersteunt het automatisch schalen van dialoogvensters met behulp van een relatieve maateenheid met de naam dialoogvensters. Een dialoogvenstereenheid is gebaseerd op het systeemlettertype en de relatie met pixels kan worden bepaald door de Win32 SDK-functie GetDialogBaseUnits. Wanneer een gebruiker het thema wijzigt dat door Windows wordt gebruikt, worden alle dialoogvensters automatisch aangepast. Daarnaast ondersteunt .NET Framework automatisch schalen op basis van het standaardlettertype of de weergaveresolutie. Optioneel kan automatisch schalen worden uitgeschakeld in een toepassing.

Oorspronkelijke ondersteuning voor automatisch schalen

Versies 1.0 en 1.1 van .NET Framework ondersteund automatisch schalen op een eenvoudige manier die afhankelijk was van het standaardlettertype van Windows dat wordt gebruikt voor de gebruikersinterface, vertegenwoordigd door de Win32 SDK-waarde DEFAULT_GUI_FONT. Dit lettertype wordt doorgaans alleen gewijzigd wanneer de weergaveresolutie verandert. Het volgende mechanisme is gebruikt om automatisch schalen te implementeren:

  1. Tijdens het ontwerp is de eigenschap AutoScaleBaseSize (die nu is afgeschaft) ingesteld op de hoogte en breedte van het standaardsysteemlettertype op de computer van de ontwikkelaar.

  2. Tijdens runtime werd het standaardsysteemlettertype van de computer van de gebruiker gebruikt om de eigenschap Font van de Form-klasse te initialiseren.

  3. Voordat het formulier werd weergegeven, werd de ApplyAutoScaling methode aangeroepen om het formulier te schalen. Met deze methode worden de relatieve schaalgrootten berekend van AutoScaleBaseSize en Font, en vervolgens wordt de Scale-methode aangeroepen om het formulier en zijn kinderen daadwerkelijk te schalen.

  4. De waarde van AutoScaleBaseSize is bijgewerkt, zodat volgende aanroepen naar ApplyAutoScaling het formaat van het formulier niet geleidelijk hebben gewijzigd.

Hoewel dit mechanisme voldoende was voor de meeste doeleinden, leed het aan de volgende beperkingen:

  • Aangezien de eigenschap AutoScaleBaseSize de tekengrootte van de basislijn vertegenwoordigt in gehele getallen, treden afrondingsfouten op die duidelijk zichtbaar worden wanneer een formulier wordt doorgelopen door meerdere resoluties.

  • Automatisch schalen is alleen geïmplementeerd in de Form-klasse, niet in de klasse ContainerControl. Als gevolg hiervan worden gebruikersbesturingselementen alleen correct geschaald wanneer het gebruikersbesturingselement is ontworpen op dezelfde resolutie als het formulier en het in het formulier werd geplaatst tijdens het ontwerp.

  • Formulieren en hun onderliggende besturingselementen kunnen alleen gelijktijdig worden ontworpen door meerdere ontwikkelaars als hun computerresoluties hetzelfde waren. Op dezelfde manier werd de overname van een formulier afhankelijk van de resolutie die aan het bovenliggende formulier is gekoppeld.

  • Het is niet compatibel met de nieuwere indelingsbeheerders die zijn geïntroduceerd met .NET Framework versie 2.0, zoals FlowLayoutPanel en TableLayoutPanel.

  • Het biedt geen ondersteuning voor schalen op basis van de weergaveresolutie die vereist is voor compatibiliteit met het .NET Compact Framework.

Hoewel dit mechanisme behouden blijft in .NET Framework versie 2.0 om compatibiliteit met eerdere versies te behouden, is het vervangen door het robuustere schaalmechanisme dat hierna wordt beschreven. Als gevolg hiervan worden de overbelastingen AutoScale, ApplyAutoScaling, AutoScaleBaseSizeen bepaalde Scale als verouderd gemarkeerd.

Notitie

U kunt veilig verwijzingen naar deze leden verwijderen wanneer u uw verouderde code bijwerkt naar .NET Framework versie 2.0.

Huidige ondersteuning voor automatisch schalen

De eerdere beperkingen van .NET Framework versie 2.0 worden vervangen door de volgende wijzigingen aan te brengen in het automatisch schalen van Windows Forms:

  • Basisondersteuning voor schalen is verplaatst naar de ContainerControl-klasse, zodat formulieren, systeemeigen samengestelde besturingselementen en gebruikers alle ondersteuning voor uniform schalen ontvangen. De nieuwe leden AutoScaleFactor, AutoScaleDimensions, AutoScaleMode en PerformAutoScale zijn toegevoegd.

  • De Control-klasse heeft ook verschillende nieuwe leden waarmee deze kan deelnemen aan schaalaanpassing en ondersteuning biedt voor gemengde schalen op hetzelfde formulier. Met name ondersteunen de leden Scale, ScaleChildrenen GetScaledBounds het schalen.

  • Ondersteuning voor schalen op basis van de schermresolutie is toegevoegd ter aanvulling op systeemlettertypeondersteuning, zoals gedefinieerd door de opsomming AutoScaleMode. Deze modus is compatibel met automatisch schalen dat wordt ondersteund door .NET Compact Framework, waardoor de migratie van toepassingen eenvoudiger wordt.

  • Compatibiliteit met indelingsmanagers zoals FlowLayoutPanel en TableLayoutPanel is toegevoegd aan de implementatie van automatisch schalen.

  • Schaalfactoren worden nu weergegeven als drijvende-kommawaarden, meestal met behulp van de SizeF structuur, zodat afrondingsfouten praktisch zijn geëlimineerd.

Voorzichtigheid

Willekeurige combinaties van DPI- en lettertypeschaalmodi worden niet ondersteund. Hoewel u een gebruikersbesturingselement met één modus (bijvoorbeeld DPI) kunt schalen en zonder problemen in een formulier kunt plaatsen met een andere modus (Lettertype), kan het combineren van een basisformulier in de ene modus en een afgeleid formulier in een andere leiden tot onverwachte resultaten.

Automatisch schalen in actie

Windows Forms maakt nu gebruik van de volgende logica om formulieren en hun inhoud automatisch te schalen:

  1. Tijdens het ontwerp registreert elke ContainerControl respectievelijk de schaalmodus en de huidige resolutie in de AutoScaleMode en AutoScaleDimensions.

  2. Tijdens runtime wordt de werkelijke resolutie opgeslagen in de eigenschap CurrentAutoScaleDimensions. De eigenschap AutoScaleFactor berekent dynamisch de verhouding tussen de uitvoerings- en ontwerptijdschaalresolutie.

  3. Wanneer het formulier wordt geladen en de waarden van CurrentAutoScaleDimensions en AutoScaleDimensions verschillen, wordt de PerformAutoScale methode aangeroepen om het besturingselement en de onderliggende elementen te schalen. Deze methode onderbreekt de indeling en roept de Scale methode aan om de werkelijke schaalaanpassing uit te voeren. Daarna wordt de waarde van AutoScaleDimensions bijgewerkt om progressief schalen te voorkomen.

  4. PerformAutoScale wordt ook automatisch aangeroepen in de volgende situaties:

    • In reactie op de OnFontChanged gebeurtenis wanneer de schaalmodus Fontis.

    • Wanneer de indeling van het containerbesturingselement wordt hervat en er een wijziging wordt gedetecteerd in de eigenschappen AutoScaleDimensions of AutoScaleMode.

    • Zoals eerder aangegeven, wordt een ouder ContainerControl geschaald. Elk containercontrole is verantwoordelijk voor het schalen van zijn kinderen met behulp van zijn eigen schaalfactoren, en niet van de bovenliggende container.

  5. Kindbesturingselementen kunnen hun schaalgedrag op verschillende manieren aanpassen:

    • De eigenschap ScaleChildren kan worden overschreven om te bepalen of de onderliggende besturingselementen moeten worden geschaald of niet.

    • De methode GetScaledBounds kan worden overschreven om de grenzen aan te passen waarnaar het besturingselement wordt geschaald, maar niet de schaallogica.

    • De methode ScaleControl kan worden overschreven om de schaallogica voor het huidige besturingselement te wijzigen.

Zie ook