WIN32

2009-07-14 30 views
16

'da bir String'in genişliğini nasıl bulabilirim? WIN32'de bir dizinin genişliğini GetTextMetrics işlevini kullanmaktan ve tmAveCharWidth * strSize?WIN32

+2

"tmAveCharWidth * strSize", sabit genişlikli fontlar için yalnızca aklı başındadır. –

cevap

20

GetTextExtentPoint32 kullanmayı deneyin. Bu, mantıksal birimlerde işlenen dizenin genişliğini ve yüksekliğini ölçmek için verilen aygıt bağlamı için geçerli yazı tipini kullanır. Varsayılan haritalama modu için, MM_TEXT, 1 mantıksal birim 1 pikseldir. Ancak, geçerli aygıt bağlamı için eşleme modunu değiştirdiyseniz, mantıksal bir birim pikselle aynı olmayabilir. Farklı mapping modes on MSDN hakkında bilgi alabilirsiniz. Eşleme modu ile GetTextExtentPoint32 tarafından size döndürülen boyutları piksellere dönüştürebilirsiniz.

+0

Teşekkürler, ben bunun için tanımaktayım. :) – Razvi

+1

GetTextExtentPoint32, "mantıksal birimleri" kullanır; piksel değil: http://msdn.microsoft.com/en-us/library/dd144938%28VS.85%29.aspx – user20493

+1

@user iyi yakalama. Eşleme modu, MM_TEXT (varsayılan), 1 mantıksal birim = 1 piksel olduğunda, ancak bu mutlaka doğru olmak zorunda değildir. Cevabımı değiştireceğim. –

3

Graphics::MeasureString?

VOID Example_MeasureString(HDC hdc) 
{ 
    Graphics graphics(hdc); 
    // Set up the string. 
    WCHAR string[] = L"Measure Text"; 
    Font font(L"Arial", 16); 
    RectF layoutRect(0, 0, 100, 50); 
    RectF boundRect; 
    // Measure the string. 
    graphics.MeasureString(string, 12, &font, layoutRect, &boundRect); 
    // Draw a rectangle that represents the size of the string. 
    graphics.DrawRectangle(&Pen(Color(255, 0, 0, 0)), boundRect); 
}
+0

Yönteminiz, kesinlikle GetTextExtentPoint32() kullanmaktan daha iyidir. –

+0

Kafam karıştı. layoutRect nedir? Anlayamıyorum – Kross

1

Bunu nasıl kullandığınıza bağlı olarak, DrawText'i DT_CALCRECT ile belirtebilirsiniz ve bunu (her zaman benim için oldukça doğru bir şekilde yaptı) metin/yazı tipi/etc'ye bağlı olarak gerekli dikdörtgenin boyutunu hesaplar.

13

Kesin bilmiyorum, ama gibi görünüyor:

HDC hDC = GetDC(NULL); 
RECT r = { 0, 0, 0, 0 }; 
char str[] = "Whatever"; 
DrawText(hDC, str, strlen(str), &r, DT_CALCRECT); 

işe yarayabilir.

+0

Teşekkürler, denedik ve GetTextExtentPoint32 :) ile aynı genişlik gösteriyor. – Razvi

+2

Bu, eşleme modunu denklem dışında aldığından, GetTextExtentPoint32'den çok daha iyi bir çözümdür. Yazarın değişmesi gereken bir şey de DrawText'in bayrakları. 'DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE'. Ortaya çıkan genişlik daha sonra "abs (r.right - r.left);" – c00000fd

0

Builder C++ için önce yeni TLabel'i dinamik olarak yapın ve font niteliklerini değiştirin. TLabel'ınızı autosize olarak ayarlayın. Daha sonra size TLabel width cadı string genişliğinizi piksel cinsinden gösterir.

int WidthPixels (String font, int size, String text) 
{ 
    TLabel* label = new TLabel(Form1); // dynamic TLabel 
    label->AutoSize = true; 
    label->Font->Name = font; // your font 
    label->Font->Size = size; // your font size 
    label->Caption = text; // your string 
    return label->Width; 
} 

int width = WidthPixels("Times New Roman", 19 , "Hey");