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ında 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, metin kutusu içeriği gibi metin öğeleri diğer uygulamalardan daha küçük işlenir. 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 noktadır (DPI), bu da %100 ekran ölçeklendirmesine eşittir, ancak %125, %150, %200 'ü destekleyen daha yüksek çözünürlüklü görüntüler (sırasıyla 120, 144 ve 192 DPI'ye eşittir) ve üzeri 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. Bir iletişim kutusu birimi sistem yazı tipini temel alır ve Win32 SDK işlevi GetDialogBaseUnitsolsa da pikselle ilişkisi 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_FONT Win32 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 özelliği AutoScaleBaseSize (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, sınıfın özelliğini Form başlatmak için kullanıcının makinesinin Font varsayılan sistem yazı tipi kullanıldı.

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

  4. değeri AutoScaleBaseSize güncelleştirildi, böylece sonraki çağrılar ApplyAutoScaling formu aşamalı olarak yeniden boyutlandırmadı.

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

  • AutoScaleBaseSize özelliği, taban çizgisi yazı tipi boyutunu tamsayı değerleri olarak temsil ettiğinden, bir form birden çok çözünürlükte geçirildiğinde ortaya çıkan yuvarlama hataları oluşur.

  • Otomatik ölçeklendirme, sınıfta değil ContainerControl 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.

  • ve gibi FlowLayoutPanelTableLayoutPanel.NET Framework sürüm 2.0 ile sunulan 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üklemeler eski olarak işaretlenir.

Dekont

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, yerel bileşik denetimler ve kullanıcı denetimlerinin tümünün ContainerControl tekdüzen ölçeklendirme desteği alması için ölçeklendirme için temel destek sınıfına taşındı. Yeni , ve AutoScaleDimensionsAutoScaleModePerformAutoScale üyeleri AutoScaleFactoreklendi.

  • Sınıfın Control ayrıca ölçeklendirmeye katılmasını ve aynı formda karma ölçeklendirmeyi desteklemesini sağlayan birkaç yeni üyesi vardır. ScaleÖzellikle , ScaleChildrenve GetScaledBounds üyeleri ölçeklendirmeyi destekler.

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

  • ve gibi FlowLayoutPanelTableLayoutPanel düzen yöneticileriyle uyumluluk, otomatik ölçeklendirmenin uygulanmasına eklenmiştir.

  • Ölçeklendirme faktörleri artık genellikle yapı kullanılarak kayan SizeF 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 ContainerControl biri ölçeklendirme modunu ve geçerli çözünürlüğü sırasıyla ve AutoScaleDimensionsiçinde AutoScaleMode kaydeder.

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

  3. Form yüklendiğinde ve AutoScaleDimensions değerleri CurrentAutoScaleDimensions farklıysa, PerformAutoScale denetimi ve alt öğelerini ölçeklendirmek için 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 yöntemini çağırır Scale . Daha sonra, aşamalı ölçeklendirmeyi önlemek için değeri AutoScaleDimensions güncelleştirilir.

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

    • Ölçeklendirme modu ise Fontolaya yanıt olarakOnFontChanged.

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

    • Yukarıda da belirtildiği gibi, üst öğe ContainerControl ölçeklendirilirken. Her kapsayıcı denetimi, alt öğelerini üst kapsayıcısından değil kendi ölçeklendirme faktörlerini kullanarak ölçeklendirmekten sorumludur.

  5. Alt denetimler ölçeklendirme davranışlarını çeşitli yollarla değiştirebilir:

    • Özellik ScaleChildren , alt denetimlerinin ölçeklendirilip ölçeklendirilmemesi gerektiğini belirlemek için geçersiz kılınabilir.

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

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

Ayrıca bkz.