Automatisk skalning i Windows Forms
Med automatisk skalning kan ett formulär och dess kontroller, utformade på en dator med en viss bildskärmsupplösning eller systemteckensnitt, visas korrekt på en annan dator med en annan bildskärmsupplösning eller systemteckensnitt. Det säkerställer att formuläret och dess kontroller på ett intelligent sätt ändrar storlek så att de överensstämmer med interna fönster och andra program på både användarnas och andra utvecklares datorer. Med stöd för .NET Framework för automatisk skalning och visuella format kan .NET Framework-program upprätthålla ett konsekvent utseende jämfört med interna Windows-program på varje användares dator.
För det mesta fungerar automatisk skalning som förväntat i .NET Framework version 2.0 och senare. Ändringar i teckensnittsschemat kan dock vara problematiska. Ett exempel på hur du löser detta finns i Så här gör du: Svara på ändringar i teckensnittsscheman i en Windows Forms-applikation.
Behov av automatisk skalning
Utan automatisk skalning visas ett program som är utformat för en visningsupplösning eller ett teckensnitt antingen för litet eller för stort när den upplösningen eller teckensnittet ändras. Om programmet till exempel är utformat med Tahoma 9-punkt som baslinje, visas det utan justering för litet om det körs på en dator där systemteckensnittet är Tahoma 12-punkt. Textelement, till exempel rubriker, menyer, textruteinnehåll och så vidare, återges mindre än andra program. Dessutom är storleken på användargränssnittselement (UI) som innehåller text, till exempel namnlisten, menyerna och många kontroller beroende på vilket teckensnitt som används. I det här exemplet visas dessa element också relativt mindre.
En liknande situation uppstår när ett program är utformat för en viss visningsupplösning. Den vanligaste visningsupplösningen är 96 punkter per tum (DPI), vilket motsvarar 100% visningsskalning, men högre upplösning visar stöd för 125%, 150%, 200% (som respektive är lika med 120, 144 och 192 DPI) och högre blir vanligare. Utan justering visas ett program, särskilt ett grafikbaserat, utformat för en upplösning antingen för stort eller för litet när det körs med en annan upplösning.
Automatisk skalning syftar till att förbättra dessa problem genom att automatiskt ändra storlek på formuläret och dess underordnade kontroller enligt den relativa teckenstorleken eller visningsupplösningen. Windows-operativsystemet stöder automatisk skalning av dialogrutor med hjälp av en relativ måttenhet som kallas dialogenheter. En dialogenhet baseras på systemteckensnittet, och dess relation till bildpunkter kan fastställas genom Win32 SDK-funktionen GetDialogBaseUnits
. När en användare ändrar det tema som används av Windows justeras alla dialogrutor automatiskt i enlighet med detta. Dessutom stöder .NET Framework automatisk skalning, antingen enligt standardsystemteckensnittet eller visningsupplösningen. Du kan också inaktivera automatisk skalning i ett program.
Ursprungligt stöd för automatisk skalning
Versionerna 1.0 och 1.1 av .NET Framework har stöd för automatisk skalning på ett enkelt sätt som var beroende av standardteckensnittet för Windows som används för användargränssnittet, vilket representeras av Win32 SDK-värdet DEFAULT_GUI_FONT. Det här teckensnittet ändras vanligtvis bara när visningsupplösningen ändras. Följande mekanism användes för att implementera automatisk skalning:
Vid designtillfället angavs egenskapen AutoScaleBaseSize (som nu är inaktuell) till höjden och bredden på standardsystemteckensnittet på utvecklarens dator.
Vid körning användes systemets standardteckensnitt på användarens dator för att initiera egenskapen Font i klassen Form.
Innan formuläret visades anropades metoden ApplyAutoScaling för att skala formuläret. Den här metoden beräknade de relativa skalningsstorlekarna från AutoScaleBaseSize och Font, och anropade sedan metoden Scale för att faktiskt skala formuläret och dess underordnade.
Värdet för AutoScaleBaseSize uppdaterades så att efterföljande anrop till ApplyAutoScaling inte gradvis ändrade storlek på formuläret.
Även om den här mekanismen var tillräcklig för de flesta ändamål, led den av följande begränsningar:
Eftersom egenskapen AutoScaleBaseSize representerar baslinjens teckenstorlek som heltalsvärden uppstår avrundningsfel som blir uppenbara när ett formulär bearbetas genom flera upplösningar.
Automatisk skalning implementerades endast i klassen Form, inte i klassen ContainerControl. Därför skulle användarkontroller bara skalas korrekt när användarkontrollen utformades med samma upplösning som formuläret, och den placerades i formuläret vid designtillfället.
Formulär och deras barnkontroller kunde bara designas samtidigt av flera utvecklare om deras skärminställningar var desamma. På samma sätt gjorde det också arv av ett formulär beroende av den lösning som är associerad med det överordnade formuläret.
Det är inte kompatibelt med de nyare layouthanterare som introducerades med .NET Framework version 2.0, till exempel FlowLayoutPanel och TableLayoutPanel.
Den har inte stöd för skalning baserat direkt på den visningsupplösning som krävs för kompatibilitet med .NET Compact Framework.
Även om den här mekanismen bevaras i .NET Framework version 2.0 för att upprätthålla bakåtkompatibilitet, har den ersatts av den mer robusta skalningsmekanism som beskrivs härnäst. Därför markeras AutoScale, ApplyAutoScaling, AutoScaleBaseSizeoch vissa Scale överbelastningar som föråldrade.
Not
Du kan ta bort referenser till dessa medlemmar på ett säkert sätt när du uppgraderar din äldre kod till .NET Framework version 2.0.
Aktuellt stöd för automatisk skalning
.NET Framework version 2.0 övervinner tidigare begränsningar genom att införa följande ändringar i den automatiska skalningen av Windows Forms:
Basstöd för skalning har flyttats till klassen ContainerControl så att formulär, interna sammansatta kontroller och användarkontroller alla får enhetlig skalningsstöd. De nya medlemmarna AutoScaleFactor, AutoScaleDimensions, AutoScaleMode och PerformAutoScale har lagts till.
Klassen Control har också flera nya medlemmar som gör att den kan delta i skalning och stödja blandad skalning i samma formulär. Mer specifikt stöder Scale, ScaleChildrenoch GetScaledBounds medlemmar skalning.
Stöd för skalning baserat på skärmupplösningen har lagts till för att komplettera systemets teckensnittsstöd, enligt definitionen i AutoScaleMode uppräkning. Det här läget är kompatibelt med automatisk skalning som stöds av .NET Compact Framework, vilket möjliggör enklare programmigrering.
Kompatibilitet med layouthanterare som FlowLayoutPanel och TableLayoutPanel har lagts till i implementeringen av automatisk skalning.
Skalningsfaktorer representeras nu som flyttalsvärden, vanligtvis med hjälp av SizeF struktur, så att avrundningsfel praktiskt taget har eliminerats.
Försiktighet
Godtyckliga blandningar av DPI- och teckensnittsskalningslägen stöds inte. Även om du kan skala en användarkontroll med ett läge (till exempel DPI) och placera den i ett formulär med ett annat läge (teckensnitt) utan problem, men att blanda ett basformulär i ett läge och ett härlett formulär i ett annat kan leda till oväntade resultat.
Automatisk skalning i praktiken
Windows Forms använder nu följande logik för att automatiskt skala formulär och deras innehåll:
Vid designtillfället registrerar varje ContainerControl skalningsläget och den aktuella upplösningen i AutoScaleMode respektive AutoScaleDimensions.
Under körning lagras den faktiska upplösningen i egenskapen CurrentAutoScaleDimensions. Egenskapen AutoScaleFactor beräknar dynamiskt förhållandet mellan skalningsupplösningen för exekveringstid och designtid.
När formuläret läses in, om värdena för CurrentAutoScaleDimensions och AutoScaleDimensions är olika, anropas metoden PerformAutoScale för att skala kontrollen och dess underordnade element. Den här metoden pausar layouten och anropar metoden Scale för att utföra den faktiska skalningen. Därefter uppdateras värdet för AutoScaleDimensions för att undvika progressiv skalning.
PerformAutoScale anropas också automatiskt i följande situationer:
Som svar på händelsen OnFontChanged om skalningsläget är Font.
När containerkontrollens layout återupptas och en ändring identifieras i egenskaperna AutoScaleDimensions eller AutoScaleMode.
Som antyds ovan, när en överordnad ContainerControl skalas. Varje kontroll ansvarar för att skala sina barn med hjälp av sina egna skalningsfaktorer och inte den från den överordnade containern.
Barnkontroller kan ändra sitt skalningsbeteende på flera sätt:
Egenskapen ScaleChildren kan åsidosättas för att avgöra om deras underordnade kontroller ska skalas eller inte.
Metoden GetScaledBounds kan åsidosättas för att justera gränserna som kontrollen skalas till, men inte skalningslogik.
Metoden ScaleControl kan åsidosättas för att ändra skalningslogik för den aktuella kontrollen.
Se även
.NET Desktop feedback