2008-09-23 10 views
16

G ++ + 'da C++ kullanıyorum. (Bu sorun da C# içinde mevcut olabilir).MeasureString(), soldaki ve sağdaki metni kaydırır

Grafik :: MeasureString() veya Graphics :: DrawString() işlevini her aradığımda, dize sol ve sağdaki boş alanla doldurulduğunu fark ediyorum.

Örneğin, bir Courier yazı tipi kullanıyorum (italik değil!) Ve "P" ölçtüğümde 90 tane aldım, ancak "PP" bana 150 verir. Tek boşluklu bir fontun tam genişliğini ikiye katlamasını beklerdim "PP" için.

Sorum şu: bu amaçlanan veya belgelenen davranış mıdır ve bunu nasıl devre dışı bırakırım?

RectF Rect(0,0,32767,32767); 
RectF Bounds1, Bounds2; 
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1); 
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2); 
margin = Bounds1.Width * 2 - Bounds2.Width; 

cevap

11

O yöntem genişliğini ölçmek için gerçek karakterler kullanabilir ve bu çıkıntılar, söz konusu küçük dolgu ekler etmez, tasarım var.

düzeninde bitişik dizeleri (biçimlendirilmiş metin uygularken, örneğin), MeasureString arasında MeasureCharacterRanges yöntemi ya da bir kullanım için uygun ölçümleri elde etmek için:

MSDN daha fazla doğruluk gerekirse farklı bir yöntem kullanılarak da anlaşılacağı StringFormat alır ve GenericTypographic iletin. Ayrıca, Graphics için TextRenderingHint'un AntiAlias olduğundan emin olun. o da bu kb makalesinde dayalı ima bağlanırken olabilir gibi

6

Bu tasarım gereğidir bu doğru kabul edilen cevap ancak link aslında mükemmel değildir, geliyor. Sorun, gerçekten kullanmak istediğiniz şey piksel (ints) olduğunda tüm bu yöntemlerde yüzer kullanımıdır.

TextRenderer class, bu amaç için tasarlanmıştır ve gerçek boyutlarla çalışır. Bunu kullanmanın bir yolu için bu link from msdn'a bakın.

+0

TextRenderer sınıfı ile daha iyi sonuçlar elde ediyorum. – Bitterblue

+0

TextRenderer, benzer bir durumda tam olarak ihtiyaç duyduğum şeydi – Rob

+0

TextRenderer benim için çok daha iyi çalıştı – Migs

0

TextRenderer, yazı tipinin boyutunu almak için mükemmeldi. Ancak çizim döngüsünde, TextRenderer.DrawText kullanarak graphics.DrawString() 'e göre zorlayıcı bir şekilde yavaştı. bir dize genişliği yana

çözecektir, Sorununuz TextRenderer.MeasureText ve graphics.DrawString bir arada kullanarak çok daha iyi ..

5

ekleme StringFormat.GenericTypographic sorundur:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic); 

uygula DrawString ile aynı özellik.

+0

GenericTypographic benim için ideal, çünkü yine de kontrolde kendi payımı kullanıyorum. –

+0

Neredeyse mükemmel ama küçük yastıklar gerekli. – Slappy

İlgili konular