web-dev-qa-db-ja.com

WIN32で文字列の幅(ピクセル単位)を見つける方法

GetTextMetrics関数を使用してtmAveCharWidth * strSizeを使用するよりも、WIN32で文字列の幅をより正確に測定できますか?

17
Razvi

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

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

22
Nick Meyer

確かなことはわかりませんが、次のように思われます。

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

うまくいくかもしれません。

15
Evan Teran

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);
}

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

1
DeusAduro

Builder C++の場合、最初に新しいTLabelを動的に作成してから、フォント属性を変更します。TLabelをautosizeとして設定します。次に、TLabel幅を取得できます。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");