2

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を選択したときに実行されるコードは次のとおりです。

CreateFontIndirectに渡されるパラメーター

GetTextMetricsから返されたTEXTMETRICS構造

4

1 に答える 1

0

これは確かにClearTypeが機能していることがわかりました(Deannaに感謝します)。ClearTypeをオフにすると、コードを変更せずに表示の問題が修正されますが、アプリケーションがClearTypeでどのように動作するかを修正する必要があります。

また、ClearTypeはデフォルトでオフになっているため、この問題はWindows XPには存在しませんでしたが、Windows 7(およびVista)ではデフォルトでオンになっています。

于 2012-04-24T09:55:48.693 に答える