質問者
TextOutとDrawTextでの文字の回転の違い

質問
-
お世話になります。
MFCのプログラムで回転した文字列を描画しようとしていますが、
TextOutとDrawTextで回転方向が違います。
何かプログラムの記述方法に問題があるのでしょうか?以下のサンプルプログラムでTextOut(赤)、DrawText(青)で文字列を描画していますが
指定した角度(30度)でTextOutでは時計回り、DrawTextでは反時計回りに回転します。
また、印刷プレビューをするとどちらも時計回りになり、実際に印刷すると
画面表示と同じでTextOut→時計回り、DrawText→反時計回りとなります。よろしくお願いします。
---- サンプル ----
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(5000, 5000);
pDC->SetViewportExt(500, -500);
pDC->SetViewportOrg(0, 500);
pDC->SetBkMode(TRANSPARENT);
CFont font;
font.CreateFont(700, 0, 300, 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->SetTextColor(RGB(255, 0, 0));
pDC->TextOut(1500, 1500, str, str.GetLength());
pDC->SetTextColor(RGB(0, 0, 255));
pDC->DrawText(str, CRect(1500, 2500, 0, 0), DT_NOCLIP);
pDC->SelectObject(pOldFont);
font.DeleteObject();
}
すべての返信
-
回答ではありません。あしからず。
DrawText()のマニュアルでは、uFormatに DT_NOCLIP を設定した場合は、
lpRect は評価されないような記述になってますが、これはクリップに対してだけで、
描画位置と方向については評価されてたような気がします(確信なし)。
RECT に
1. left > right、かつ top < bottom
2. left < right、かつ top < bottom
3. left < right、かつ top > bottom
を与えたケースもテストしてみてはどうでしょう。
以下は蛇足ですが、
DrawText()はメニューやウインドウタイトルなどUIコントロールに特化した描画関数なので、
MM_TEXT「以外」のマッピングモードでは非常にかわった動作をしていたように記憶してます。- 編集済み 仲澤@失業者 2015年4月24日 7:31
-
仲澤@失業者 様
返信ありがとうございます。> RECT に
> 1. left > right、かつ top < bottom
> 2. left < right、かつ top < bottom
> 3. left < right、かつ top > bottom
> を与えたケースもテストしてみてはどうでしょう。それぞれのケースを試してみましたが同じでした。
> DrawText()はメニューやウインドウタイトルなどUIコントロールに特化した描画関数なので、
> MM_TEXT「以外」のマッピングモードでは非常にかわった動作をしていたように記憶してます。そうなるとTextOutの代わりにDrawTextを使用するのは難しいかもしれませんね。
ありがとうございました。 -
もしかしたら、プリンタ ドライバの影響を受けているのかもしれないので、異なるプリンタ(出来れば異なるメーカ)で試してみることをお勧めします。
蛇足ですが、なぜプリンタ ドライバの影響が考えれるかというと。。。
GDI ベースのプリンタ ドライバの場合、TextOut() API はコールは、基本的にそのままプリンタ ドライバの DrvTextOut() に送られ処理されます。
対して DrawText() API の場合、クリップ領域等の関係上、プリンタ ドライバの DrvTextOut() 以外にも DrvDrawEscape() 等が呼び出されるので、プリンタ ドライバ側での処理はより複雑になります。
つまり、プリンタ ドライバ側でのクリッピング等の処理に問題がある場合、今回の様な問題が起きる可能性もあるのではないかと。。。