GetTextMetrics関数を使用してtmAveCharWidth * strSizeを使用するよりも、WIN32で文字列の幅をより正確に測定できますか?
GetTextExtentPoint32 を使用してみてください。これは、特定のデバイスコンテキストの現在のフォントを使用して、レンダリングされた文字列の幅と高さを論理単位で測定します。デフォルトのマッピングモードであるMM_TEXTの場合、1論理単位は1ピクセルです。
ただし、現在のデバイスコンテキストのマッピングモードを変更した場合、論理ユニットはピクセルと同じではない可能性があります。さまざまな MSDNのマッピングモード について読むことができます。マッピングモードでは、GetTextExtentPoint32から返された寸法をピクセルに変換できます。
確かなことはわかりませんが、次のように思われます。
HDC hDC = GetDC(NULL);
RECT r = { 0, 0, 0, 0 };
char str[] = "Whatever";
DrawText(hDC, str, strlen(str), &r, DT_CALCRECT);
うまくいくかもしれません。
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に基づいて必要な長方形のサイズを計算します(私にとっては常にかなり正確に実行されます)。
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");