Soru Bir Windows Forms C # uygulaması, bir kullanıcı OS yazı tipi boyutu için% 125 veya% 150 seçtiğinde yok saymayı nasıl zorlar?


Bir kullanıcı OS ayarlarında daha büyük veya daha küçük bir yüzdeyi seçtiğinde C # Windows Forms uygulamamı yazı tiplerini ölçeklememeye zorlamanın hızlı bir yoluna ihtiyacım var.

Bu mümkün mü?


25
2017-11-03 16:28


Menşei


Neden kullanıcının isteklerine aykırı davranmak istersiniz? - CodesInChaos
Muhtemelen görüşlerini fırlatacak ve her bir durum için düzeltilmesi zor olacak taşmalara sahip olacaktır. Sadece "battaniye-kuvvet-boyutu" için daha hızlı bir düzeltme olurdu. Söylediğiniz gibi bir bant yardımcısı düzeltmesi, çünkü kullanıcının en iyi ilgisi değil, ama benim 2c. - eggy
FWIW, OPPOSITE olan bir durum var: Bir tablette, tablet (touch) moduna girdiğinde, yazı tipi boyutunu otomatik olarak artırmak istiyorum sanki Kullanıcı yazı tipi boyutunu% 125 artırdı. NEDEN: Kullanılabilirlik. Parmaklar dokunmak için daha geniş alana ihtiyaç duyarlar; açık havada güneş ışığında, okunabilir olması için daha büyük metne ihtiyacınız var. Bir uygulama için geçerli nedenlerin olduğunu belirtmek için bunu belirtmek isterim. değiştirmek kullanıcı ne ayarlar. Kullanıcı, işletim sistemi yazı tipi boyutunu farklı olarak ayarlamak zorunda kalmamalı, sadece bu eski uygulamanın dokunma modunda kullanılabilmesi için. - ToolmakerSteve


Cevaplar:


İşte benim için çalışılan şey ...

        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
        this.Font = new System.Drawing.Font("Arial", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(0)));

Yukarıdaki iki satır, BaseForm.Designer.cs dosyamdan kopyalanır, ancak temel olarak "yazı tipi ölçeklendirmesi" elde etmek için iki kolay adımı buldum:

  1. AutoScaleMode'u Yok olarak ayarlayın.

  2. Varsayılan Nokta değeri yerine tüm Yazı Tipleri için Birim Türü olarak "Piksel" kullanın.

Pencerelerin fontlarınızı ölçeklendirmesine izin vermeniz gerektiği kadarıyla, bu size kalmış. Biri tasarımı sevmediğim için, eğer uygulamamın ölçeklendirilmesi gerektiğini hissettiğimde, kendi seçeneklerim ve tasarımımla kendim yapacağım.

Gerçek son kullanıcılarla konuştuğum yıllar boyunca, bunların çoğunun DPI ayarları hakkında hiçbir fikre sahip olmadığını ve varsayılan ayardan başka bir şeyleri varsa, bunun böyle olmasını istemediklerini fark ettim .. ve hiç fark etmediler çünkü hepsi kullandıkları web tarayıcısı ve belki de Excel ve Microsoft Word (hangi yazı tipini kullanıyorlarsa onu kullanırlar).

Uygulamam sistem font ayarlarına saygılı olsaydı, o kadar çok == daha az satış yapmazdı, çünkü sistem diyaloglarının yaptığı gibi bu büyük çirkin yazı tipine sahip olurdu (ve nasıl değiştirileceğini bilmiyorlardı). ama asla kullanmadıkları sistem diyaloglarını umursamıyorlar.


25
2018-05-17 22:22



Aşağıdaki formüller piksel cinsinden yazı tipi boyutunu belirlemek için kullanılabilir: pixel_size == point_size * 96/72 / for 96 dpi .. 100% - Bachor


Sorun, bir Formun veya bir kontrolün Font özelliği, Noktalar'daki yazı tipi boyutunu belirtir. DPI ayarı değiştiğinde harflerin yüksekliğini etkileyen bir ölçümdür. Bir nokta 1/72 inçtir. Varsayılan DPI, inç başına 96 nokta ve 9 puntoluk bir yazı boyutu 9/72 x 96 = 12 piksel yüksekliğinde bir harf verir.

Kullanıcı DPI ayarını 120 DPI (% 125) olarak gösterdiğinde, harf 9/72 x 120 = 15 piksel yüksek olur. Denetimin daha büyük olmasına izin vermezseniz, metin artık kontrole uymaz. Bakmak için çok çirkin.

Form.AutoScaleMode özelliği bu sorunu çözer. Formun hangi boyutta tasarlandığını kontrol eder ve çalıştığı makinedeki DPI ile karşılaştırır. Ve bu tür kırpma işlemlerinin gerçekleşmeyeceğinden emin olmak için denetimleri yeniden boyutlandırır ve yeniden yerleştirir. Çok kullanışlı, bu konuda hiçbir şey yapmadan tamamen otomatik.

Tipik problem, önceki paragrafta yer alan "yeniden konumlandırma" bitidir. Formun boyutunu devralmak yerine kendi yazı tipi boyutlarını verirseniz veya formun otomatik düzeni kosher değilse, denetimler formun düzenlenmiş görünümünü yok ederek yanlış yerde olabilir.

Bunu düzeltmeniz gerekiyor, sorunun kaynağının ne olabileceği sorusundan net değil. Bu otomatik ölçeklemenin işini yapmasını engellemeye çalışmak sürdürülebilir değildir. Formdaki tüm kontrolleri yinelemeniz ve Yazı tiplerini değiştirerek daha küçük bir font boyutu seçmeniz gerekir. Ancak bu, şu andan itibaren birkaç yıl içinde başınıza belaya girecek, zaten değilse. Kullanıcınız posta pulu ile çalışmak zorunda olmaktan şikayet edecek.

Mizanpaj sorununu ayıklamanın en kolay yolu, DPI boyutunu sürekli olarak değiştirmenin acısını ortadan kaldırmaktır, bu kodu geçici olarak form sınıfınıza yapıştırmaktır:

    protected override void OnLoad(EventArgs e) {
        this.Font = new Font(this.Font.FontFamily, this.Font.SizeInPoints * 125 / 96);
        base.OnLoad(e);
    }

16
2017-11-03 17:28



+1. Ancak, içerilen kontroller tarafından değiştirilen bir fontun miras alınıp alınmasının, AutoScaleMode'un amaçlanan şekilde çalışmamasını sağladığını eklemek istiyorum, cevabımın sonunda bağlantıya bakın. Bir geçici çözüm olarak, tüm denetimlerin yazı tiplerini açıkça değiştirmek zorundadır. - Doc Brown


Oldukça kolay bir çözüm buldum.

this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;

Bu, metnin otomatik ölçek boyutundan bağımsız olarak aynı boyutta olmasını sağlayacaktır.


6
2018-04-22 10:17



Kontrol / formun yaşam döngüsünde hangi aşamada bu ayarlanır? Kurucuda? InitializeComponent Rutin? - DarrenMB


Hayır. GDI ve Windows Formları çözünürlüğe bağlıdır. En iyi seçenek, düzenlerinizi, bir pencere yeniden boyutlandırıldığında uygun şekilde ölçeklenecek şekilde tasarlamaktır. Bu, yazı tipi ölçeklendirmesinin doğru şekilde çalışmasına izin verir. Ayrıca, düzenler gerektiği gibi ayarlanır.

Bu, bu arada, WPF'deki büyük geliştirmelerden biridir - çözünürlükten bağımsız olarak tasarlanmıştır.


2
2017-11-03 16:32





Şimdiden denediğinden şüpheleniyorum

yourform.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;

formlarınızda, formlarınızın ölçeklemelerini önleyen, ancak yazı tiplerinizi değil. Yani yapmanız gerekenler (önerilmese bile, diğer yayınlara bakın) formunuzdaki tüm denetimler için yazı tipi boyutunu sabit bir boyuta ayarlıyor:

İşte bir formun tüm kontrollerini ele geçirmek için bir kod snippet'i:

    public List<Control> FindAllControls(Control container)
    {
        List<Control> controlList = new List<Control>();
        FindAllControls(container, controlList);
        return controlList;
    }

    private void FindAllControls(Control container, IList<Control> ctrlList)
    {
        foreach (Control ctrl in container.Controls)
        {
            if (ctrl.Controls.Count == 0)
                ctrlList.Add(ctrl);
            else
                FindAllControls(ctrl, ctrlList);
        }
    }

Altında http://www.csharp411.com/change-font-size/ Özellikle sabit piksel büyüklüğünü kullanmak istediğinizde, bir kontrolün yazı tipi boyutunu nasıl değiştireceğinize dair bir bağlantı bulacaksınız. Bence bu araçlarla kendi başınıza bir araya getirebilirsiniz.

EDIT: Söylemek için unutma: nihayet OS yazı tipi boyutunu görmezden gelmek ve AutoScaleMode amaçlandığı gibi kullanmak için gidiyoruz: Bu bazı tuhaflıklar var, bkz. önceki yazımda bu yüzden SO.


2
2017-11-03 17:00





Bunun gibi kullanıcı isteklerine karşı çıkmak, istekli bir şekilde MS'in barındığı bir şey değildir.

Semptomu düzeltmekten ziyade (uygulamanız doğru ölçeklemiyor), sorunu düzeltmek için muhtemelen bu kadar hızlı olmaz mıydı? Bir kullanıcı daha büyük yazı tiplerini seçtiğinde, genellikle bunları okuyabilmek için daha büyük harflere ihtiyaç duyduklarından; Bu nedenle ölçekleme doğru şekilde ölçeklendirilmekten ve kullanıcıya okunamayandan daha önemlidir.


1
2017-11-03 16:32



Bunu yapmamanızı öneren, "otomatik ölçeklendirmeye nasıl zorlanmalı" sorusu değil mi? - sudarsanyes
Kullanıcının Windows ayarlarına uymamanın bir yolunu bulmak yerine uygulama ölçeğini doğru bir şekilde yapmayı önerdim. - Gabriel Magana
Bunun soruya cevap verdiğine inanmıyorum. "XYZ'nin yapılmaması gerektiğini" söylemek yararlı olsa da, XYZ yapamazsanız "XYZ yapamazsınız" demek yararlı olmaz. Bu cevap orijinal soruya bir yorum olarak işe yarayabilir, ama bir cevap olarak değil. - mrmillsy


  • Windows 8.0'da, Yazı Tipi Birimini Pixel olarak ayarlasanız bile, Otomatik Ayarlama Yok olarak ayarlanmışsa, otomatik ölçeklendirme.
  • Windows 7'de, aynı uygulama otomatik ölçeklendirme değildir.

Bu nedenle, Windows 7'de metninizin otomatik olarak ölçeklenmesine izin vermemin tek yolu, Yazı Tipi Birimini Pixel ve Window'un AutoScaling özelliğini Yok olarak ayarlamanızdır.

Ve Windows 8.0'da başka bir seçeneğiniz yok, ama dpi'yi geliştirici makinesinin dpi'sine ayarlamanız ve kullanıcının bunu asla değiştirmemesini istemek!


1
2018-06-04 08:52



VEYA Windows 8'deki farklı davranışı devre dışı bırakmak için uygulamanın "uyumluluğunu" Windows 7'ye ayarlayın - ToolmakerSteve