Aracılığıyla paylaş


Windows Forms'da otomatik ölçeklendirme

Otomatik ölçeklendirme, bir formun ve belirli bir görüntü çözünürlüğüne veya sistem yazı tipine sahip bir makinede tasarlanan denetimlerinin farklı bir görüntü çözünürlüğüne veya sistem yazı tipine sahip başka bir makinede uygun şekilde görüntülenmesini sağlar. Formun ve denetimlerinin, hem kullanıcıların hem de diğer geliştiricilerin makinelerindeki yerel pencereler ve diğer uygulamalarla tutarlı olacak şekilde akıllı bir şekilde yeniden boyutlandırılacağını garanti eder. Otomatik ölçeklendirme ve görsel stiller için .NET Framework desteği, .NET Framework uygulamalarının her kullanıcının makinesindeki yerel Windows uygulamalarıyla karşılaştırıldığında tutarlı bir görünüm ve his korumasına olanak tanır.

Çoğunlukla, otomatik ölçeklendirme .NET Framework sürüm 2.0 ve sonraki sürümlerde beklendiği gibi çalışır. Ancak yazı tipi düzeni değişiklikleri sorunlu olabilir. Bunun nasıl çözüleceğini gösteren bir örnek için bkz. Nasıl yapılır: Windows Forms UygulamasıYazı Tipi Düzeni Değişikliklerine Yanıt Verme.

Otomatik ölçeklendirme gerekiyor

Otomatik ölçeklendirme olmadan, bir görüntü çözünürlüğü veya yazı tipi için tasarlanmış bir uygulama, çözünürlük veya yazı tipi değiştirildiğinde çok küçük veya çok büyük görünür. Örneğin, uygulama temel olarak Tahoma 9 noktası kullanılarak tasarlandıysa, sistem yazı tipinin Tahoma 12 punto olduğu bir makinede çalıştırıldığında ayarlama yapılmadan çok küçük görünür. Başlıklar, menüler ve metin kutusu içeriği gibi metin öğeleri, diğer uygulamalardakilere göre daha küçük görünür. Ayrıca, başlık çubuğu, menüler ve birçok denetim gibi metin içeren kullanıcı arabirimi (UI) öğelerinin boyutu kullanılan yazı tipine bağlıdır. Bu örnekte, bu öğeler nispeten daha küçük görünecektir.

Bir uygulama belirli bir ekran çözünürlüğü için tasarlandığında benzer bir durum oluşur. En yaygın görüntü çözünürlüğü, inç başına 96 nokta (DPI) ve 100% ekran ölçeklendirmesine eşittir, ancak daha yüksek çözünürlüklü ekranlar 125%, 150%, 200% (sırasıyla 120, 144 ve 192 DPI'ye eşittir) ve üzerini destekleyen görüntüler daha yaygın hale gelmektedir. Ayarlama yapılmadan, özellikle grafik tabanlı bir çözünürlük için tasarlanmış bir uygulama, başka bir çözünürlükte çalıştırıldığında çok büyük veya çok küçük görünür.

Otomatik ölçeklendirme, formu ve alt denetimlerini göreli yazı tipi boyutuna veya görüntü çözünürlüğüne göre otomatik olarak yeniden boyutlandırarak bu sorunları hafifletmeye çalışır. Windows işletim sistemi, iletişim birimleri adı verilen göreli bir ölçü birimi kullanarak iletişim kutularının otomatik olarak ölçeklendirilebilirliğini destekler. İletişim kutusu birimi, sistem yazı tipine dayanır ve piksellerle ilişkisi Win32 SDK işlevi GetDialogBaseUnitsaracılığıyla belirlenebilir. Kullanıcı Windows tarafından kullanılan temayı değiştirdiğinde, tüm iletişim kutuları buna göre otomatik olarak ayarlanır. Buna ek olarak, .NET Framework varsayılan sistem yazı tipine veya görüntü çözünürlüğüne göre otomatik ölçeklendirmeyi destekler. İsteğe bağlı olarak, bir uygulamada otomatik ölçeklendirme devre dışı bırakılabilir.

Otomatik ölçeklendirme için özgün destek

.NET Framework'ün 1.0 ve 1.1 sürümleri, DEFAULT_GUI_FONTWin32 SDK değeriyle temsil edilen, kullanıcı arabirimi için kullanılan Windows varsayılan yazı tipine bağımlı olan basit bir şekilde otomatik ölçeklendirmeyi desteklemektedir. Bu yazı tipi genellikle yalnızca görüntü çözünürlüğü değiştiğinde değiştirilir. Otomatik ölçeklendirmeyi uygulamak için aşağıdaki mekanizma kullanılmıştır:

  1. Tasarım zamanında, AutoScaleBaseSize özelliği (artık kullanım dışıdır) geliştiricinin makinesindeki varsayılan sistem yazı tipinin yüksekliğine ve genişliğine ayarlanmıştır.

  2. Çalışma zamanında, Form sınıfının Font özelliğini başlatmak için kullanıcının makinesinin varsayılan sistem yazı tipi kullanılmıştır.

  3. Formu görüntülemeden önce, formu ölçeklendirmek için ApplyAutoScaling yöntemi çağrıldı. Bu yöntem, AutoScaleBaseSize ve Font göreli ölçek boyutlarını hesaplayıp formu ve alt öğelerini gerçekten ölçeklendirmek için Scale yöntemi olarak adlandırmıştır.

  4. AutoScaleBaseSize değeri, ApplyAutoScaling'in sonraki çağrılarının formu aşamalı olarak yeniden boyutlandırmaması için güncelleştirildi.

Bu mekanizma çoğu amaç için yeterli olsa da, aşağıdaki sınırlamalardan muzdariptir:

  • AutoScaleBaseSize özelliği, taban yazı tipi boyutunu tamsayı değerleri olarak temsil ettiğinden, bir form birden çok çözünürlüklü döngüye sokulduğunda yuvarlama hataları fark edilir hale gelir.

  • Otomatik ölçeklendirme, ContainerControl sınıfında değil yalnızca Form sınıfında uygulandı. Sonuç olarak, kullanıcı denetimleri yalnızca kullanıcı denetimi formla aynı çözünürlükte tasarlandığında ve tasarım zamanında forma yerleştirildiğinde doğru şekilde ölçeklendirilebilir.

  • Formlar ve alt denetimleri yalnızca makine çözünürlükleri aynıysa birden çok geliştirici tarafından eşzamanlı olarak tasarlanabilir. Benzer şekilde, bir formun devralma işlemini de üst formla ilişkilendirilmiş çözümlemeye bağımlı hale getirdi.

  • .NET Framework sürüm 2.0 ile sunulan FlowLayoutPanel ve TableLayoutPanelgibi yeni düzen yöneticileriyle uyumlu değildir.

  • .NET Compact Framework'e uyumluluk için gereken görüntü çözünürlüğüne göre ölçeklendirmeyi doğrudan desteklemedi.

Bu mekanizma geriye dönük uyumluluğu korumak için .NET Framework sürüm 2.0'da korunsa da, bundan sonra açıklanan daha güçlü ölçeklendirme mekanizması tarafından yerini almıştır. Sonuç olarak, AutoScale, ApplyAutoScaling, AutoScaleBaseSizeve bazı Scale aşırı yüklemeleri eski olarak işaretlenir.

Not

Eski kodunuzu .NET Framework sürüm 2.0'a yükselttiğinizde bu üyelere yönelik başvuruları güvenle silebilirsiniz.

Otomatik ölçeklendirme için geçerli destek

.NET Framework sürüm 2.0, Windows Forms'un otomatik ölçeklendirmesinde aşağıdaki değişiklikleri sunarak önceki sınırlamaları aşıyor:

  • Formların, yerel bileşik denetimlerin ve kullanıcı denetimlerinin tümünün tekdüzen ölçeklendirme desteği alması için ölçeklendirme için temel destek ContainerControl sınıfına taşındı. AutoScaleFactor, AutoScaleDimensions, AutoScaleMode ve PerformAutoScale yeni üyeler eklendi.

  • Control sınıfı, ölçeklendirmeye katılmasını ve aynı formda karma ölçeklendirmeyi desteklemesini sağlayan birkaç yeni üyeye de sahiptir. Özellikle Scale, ScaleChildrenve GetScaledBounds üyeleri ölçeklendirmeyi destekler.

  • Ekran çözünürlüğüne dayalı ölçeklendirme desteği, AutoScaleMode numaralandırması tarafından tanımlanan sistem yazı tipi desteğine eklenmiştir. Bu mod, .NET Compact Framework tarafından desteklenen otomatik ölçeklendirme ile uyumludur ve uygulama geçişini kolaylaştırır.

  • otomatik ölçeklendirmenin uygulanmasına FlowLayoutPanel ve TableLayoutPanel gibi düzen yöneticileriyle uyumluluk eklendi.

  • Ölçeklendirme faktörleri artık genellikle SizeF yapısı kullanılarak kayan nokta değerleri olarak temsil edilir, böylece yuvarlama hataları pratikte ortadan kaldırılmıştır.

Dikkat

DPI ve yazı tipi ölçeklendirme modlarının rastgele karışımları desteklenmez. Kullanıcı denetimini bir modu (örneğin DPI) kullanarak ölçeklendirebilir ve sorun olmadan başka bir mod (Yazı Tipi) kullanarak bir forma yerleştirebilirsiniz, ancak temel formu bir modda ve türetilmiş bir formu başka bir modda karıştırmak beklenmeyen sonuçlara yol açabilir.

Otomatik ölçeklendirme işlemi

Windows Forms artık formları ve içeriklerini otomatik olarak ölçeklendirmek için aşağıdaki mantığı kullanır:

  1. Tasarım zamanında, her biri ContainerControl ölçeklendirme modunu ve geçerli çözünürlüğünü sırasıyla AutoScaleMode ve AutoScaleDimensions'ye kaydeder.

  2. Çalışma zamanında gerçek çözünürlük CurrentAutoScaleDimensions özelliğinde depolanır. AutoScaleFactor özelliği, çalışma zamanı ile tasarım zamanı ölçeklendirme çözünürlüğü arasındaki oranı dinamik olarak hesaplar.

  3. Form yüklendiğinde, CurrentAutoScaleDimensions ve AutoScaleDimensions değerleri farklıysa, denetimi ve alt öğelerini ölçeklendirmek için PerformAutoScale yöntemi çağrılır. Bu yöntem düzeni askıya alır ve gerçek ölçeklendirmeyi gerçekleştirmek için Scale yöntemini çağırır. Daha sonra, aşamalı ölçeklendirmeyi önlemek için AutoScaleDimensions değeri güncelleştirilir.

  4. PerformAutoScale aşağıdaki durumlarda da otomatik olarak çağrılır:

    • OnFontChanged olayına yanıt olarak, ölçeklendirme modu Fontise.

    • Kapsayıcı denetiminin düzeni devam ettiğinde ve AutoScaleDimensions veya AutoScaleMode özelliklerinde bir değişiklik algılandığında.

    • Yukarıda da belirtildiği gibi, bir üst ContainerControl ölçeklendirildiğinde. Her bir kapsayıcı denetimi, alt öğelerini kendi ölçeklendirme faktörlerini kullanarak, ana kapsayıcıdan gelen faktörler yerine, ölçeklendirmekten sorumludur.

  5. "Çocuk denetimler ölçekleme davranışlarını çeşitli yollarla değiştirebilir."

    • ScaleChildren özelliği, alt denetimlerin ölçeklendirilip ölçeklendirilmeyeceğini belirlemek için geçersiz kılınabilir.

    • GetScaledBounds yöntemi, denetimin ölçeklendirildiği sınırları ayarlamak için geçersiz kılınabilir ancak ölçeklendirme mantığını ayarlanamaz.

    • geçerli denetimin ölçeklendirme mantığını değiştirmek için ScaleControl yöntemi geçersiz kılınabilir.

Ayrıca bkz.