トップ回答者
TextOutで文字が欠ける

質問
-
お世話になります。
MFCのプログラムで以下の現象が発生して困っています。
あるサイズの文字を描画すると「国」や「園」などの文字の上側の線が表示されません。
フォントは今のところ「MS Pゴシック」や「MS ゴシック」では発生しますが、
「MS P明朝」や「MS 明朝」など他のフォントでは現象は確認していません。
WinXP + VisualStudio6.0
Win7 + VisualStudio2010
Win7 + VisualStudio2013
の環境で試しましたがすべて同じ現象です。
この現象についていろいろと探してみましたが、なかなか見つからず、
何かご存知の方がいらっしゃったらよろしくお願いします。
#以下のサンプルで、数値の部分は実際は可変です。
#ビューポートサイズを変えたりフォントのサイズを変更すると発生しません。---- サンプル ----
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(5000, 5000);
pDC->SetViewportExt(729, -561);
pDC->SetViewportOrg(100, 500);
CFont font;
font.CreateFont(140, 0, 0, 0, FW_NORMAL, 0, 0, 0, SHIFTJIS_CHARSET,
OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS | CLIP_LH_ANGLES, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_DONTCARE, _T("MS Pゴシック"));
CFont* pOldFont = (CFont *)pDC->SelectObject(&font);
CString str = _T("国園図圀");
pDC->TextOut(1500, 3500, str, str.GetLength());
pDC->SelectObject(pOldFont);
font.DeleteObject();
}
回答
-
SDKで試し、現象を確認しました。
細かく観察すると、TextOutのクリップ領域のデバイス座標がLPtoDPの値と等しいのに、TextOutの文字出力開始点がクリップ領域より1pixel上にずれているように見えました。
言い換えると、クリップ領域と文字出力開始点を論理座標からデバイス座標への変換するやり方が異なっているために、不具合が起っているようです。
私は、FillRgnで同様の経験をしています。Windowsの不具合でしょうけど、対処されるかどうかわかりませんので、対策を提案します。
DrawText : DT_NOCLIP rc.left = 3500, rc.top = 1500, rc.right=rc.bottom=0(n/a)でうまくいきました。
(その他)
> 「MS P明朝」や「MS 明朝」など他のフォントでは現象は確認していません。
"MS P明朝"で試しましたが、くにがまえの縦線が上線から突き出ている部分が描画されませんでした。
- 回答としてマーク 星 睦美 2015年4月21日 5:12
すべての返信
-
SDKで試し、現象を確認しました。
細かく観察すると、TextOutのクリップ領域のデバイス座標がLPtoDPの値と等しいのに、TextOutの文字出力開始点がクリップ領域より1pixel上にずれているように見えました。
言い換えると、クリップ領域と文字出力開始点を論理座標からデバイス座標への変換するやり方が異なっているために、不具合が起っているようです。
私は、FillRgnで同様の経験をしています。Windowsの不具合でしょうけど、対処されるかどうかわかりませんので、対策を提案します。
DrawText : DT_NOCLIP rc.left = 3500, rc.top = 1500, rc.right=rc.bottom=0(n/a)でうまくいきました。
(その他)
> 「MS P明朝」や「MS 明朝」など他のフォントでは現象は確認していません。
"MS P明朝"で試しましたが、くにがまえの縦線が上線から突き出ている部分が描画されませんでした。
- 回答としてマーク 星 睦美 2015年4月21日 5:12
-
snao 様
返信ありがとうございます。> 細かく観察すると、TextOutのクリップ領域のデバイス座標がLPtoDPの値と等しいのに、TextOutの文字出力開始点がクリップ領域より1pixel上にずれているように見えました。
確かにそのような感じに見えますね。
> 私は、FillRgnで同様の経験をしています。Windowsの不具合でしょうけど、対処されるかどうかわかりませんので、対策を提案します。
> DrawText : DT_NOCLIP rc.left = 3500, rc.top = 1500, rc.right=rc.bottom=0(n/a)でうまくいきました。
いろいろと試していただいてありがとうございます。
最初の投稿には書きませんでしたが、DrawTextでは同じ文字サイズでも現象が発生しないことは確認していました。
TextOutのままで何か改善策があればと思いましたが、やはりDrawTextに変更するしかなさそうですね。> "MS P明朝"で試しましたが、くにがまえの縦線が上線から突き出ている部分が描画されませんでした。
失礼しました。
よく見ると確かにそうですね。
ありがとうございました。