2009-07-14 56 views

答えて

20

GetTextExtentPoint32を使用してみてください。これは、指定されたデバイスコンテキストの現在のフォントを使用して、レンダリングされた文字列の幅と高さを論理単位で測定します。デフォルトのマッピングモードの場合、MM_TEXT、1論理単位は1ピクセルです。

ただし、現在のデバイスコンテキストのマッピングモードを変更した場合、論理ユニットはピクセルと同じではない場合があります。異なるmapping modes on MSDNについて読むことができます。マッピングモードでは、GetTextExtentPoint32によって返された寸法をピクセルに変換することができます。

+0

ありがとう、これは私がlokkingしていたものです。 :) – Razvi

+1

GetTextExtentPoint32は "論理単位"を使用します。ピクセルではありません:http://msdn.microsoft.com/en-us/library/dd144938%28VS.85%29.aspx – user20493

+1

@user良いキャッチ。マッピングモードがMM_TEXT(デフォルト)の場合、1論理単位= 1ピクセルですが、必ずしも真である必要はありません。私は私の答えを変更します。 –

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

あなたのメソッドは、GetTextExtentPoint32()を使うよりもはるかに優れています。 –

+0

私は混乱したことがあります。 layoutRectは何ですか?私はそれを理解していない – Kross

1

これを使用する方法によっては、DT_CALCRECTを指定してDrawTextを使用することができます(これは常に正確に実行されます)。text/font/etcに基づいて必要な矩形のサイズを計算します。

13

私は確かに知りませんが、ようです:

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

が働くかもしれません。

+0

ありがとう、それを試み、GetTextExtentPoint32 :)と同じ幅を示します。 – Razvi

+2

これは、GetTextExtentPoint32よりはるかに優れた解決策です。これは、マッピングモードを式から外すためです。作者が変更する必要があることの1つは、 'DrawText'のフラグです。それを 'DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE'。結果の幅は 'abs(r.right-r.left);と計算されます。 – c00000fd

0

Builderの場合、最初に新しいTLabelを動的に作成し、次にフォント属性を変更します。TLabelをautosizeとして設定します。TLabel width witchは、文字列幅をピクセル単位で表します。

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"); 
関連する問題