Windows7で実行されているBorlandC++Builder6を使用してアプリケーションを保守しています。
各文字がわずかに切り取られているため、アプリケーションはフォントCourierNewを使用して誤ってテキストを描画しています。問題は、メソッドGetTextMetricsを呼び出すときに発生します。これは、TEXTMETICS構造体に異なるtmAveCharWidth値とtmMaxCharWidth値が入力されているためです。次に、アプリケーションはtmAveCharWidthを使用して文字幅を計算しますが、その値はtmMaxCharWidth未満である可能性があるため、間違っています。その問題は私が修正します。
GetTextMetricsがCourierNewに対して異なるtmAveCharWidth値とtmMaxCharWidth値を返すのはなぜですか?私の理解では、Courier Newは等幅フォントであり、tmAveCharWidthとtmMaxCharWidthは同じである必要があります。私は他の等幅フォントでその仮定が正しいことをテストしました。
これは、問題のあるコードのセクションです。
hFont = CreateFontIndirect(&lpInstData->lf);
hDC = GetDC(hWnd);
hFontOld = SelectObject(hDC, hFont);
GetTextMetrics(hDC, &tm);
lpInstData->nCharHeight = tm.tmHeight;
lpInstData->nCharWidth = tm.tmAveCharWidth; <--- Should be using tmMaxCharWidth
サイズ12のCourierNewを選択したときに実行されるコードは次のとおりです。