none
TextOutとDrawTextでの文字の回転の違い RRS feed

  • 質問

  • お世話になります。

    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();
    }

    2015年4月24日 6:28

すべての返信

  • 回答ではありません。あしからず。
    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:23
  • 仲澤@失業者 様
    返信ありがとうございます。

    > RECT に
    >  1. left > right、かつ top < bottom
    >  2. left < right、かつ top < bottom
    >  3. left < right、かつ top > bottom
    > を与えたケースもテストしてみてはどうでしょう。

    それぞれのケースを試してみましたが同じでした。

    > DrawText()はメニューやウインドウタイトルなどUIコントロールに特化した描画関数なので、
    > MM_TEXT「以外」のマッピングモードでは非常にかわった動作をしていたように記憶してます。

    そうなるとTextOutの代わりにDrawTextを使用するのは難しいかもしれませんね。
    ありがとうございました。

    2015年4月24日 8:19
  • もしかしたら、プリンタ ドライバの影響を受けているのかもしれないので、異なるプリンタ(出来れば異なるメーカ)で試してみることをお勧めします。

    蛇足ですが、なぜプリンタ ドライバの影響が考えれるかというと。。。
    GDI ベースのプリンタ ドライバの場合、TextOut() API はコールは、基本的にそのままプリンタ ドライバの DrvTextOut() に送られ処理されます。
    対して DrawText() API の場合、クリップ領域等の関係上、プリンタ ドライバの DrvTextOut() 以外にも DrvDrawEscape() 等が呼び出されるので、プリンタ ドライバ側での処理はより複雑になります。
    つまり、プリンタ ドライバ側でのクリッピング等の処理に問題がある場合、今回の様な問題が起きる可能性もあるのではないかと。。。

    2015年4月24日 8:58
  • お馬鹿 様
    返信ありがとうございます。

    > もしかしたら、プリンタ ドライバの影響を受けているのかもしれないので、異なるプリンタ(出来れば異なるメーカ)で試してみることをお勧めします。

    HPのインクジェット
    Canonのインクジェット
    Canonのレーザー
    PDFドライバ

    等試しましたが同様の結果でした。
    #プリンタによって回転方向が異なるとそれはそれで困るのですが・・・

    ありがとうございました。

    2015年4月24日 9:24
  • DrawText() での RECT 構造体指定、なんかおかしい気が。。。

    2015年4月24日 9:49
  • お馬鹿 様
    返信ありがとうございます。

    > DrawText() での RECT 構造体指定、なんかおかしい気が。。。

    RECT構造体のポインタを指定する必要がありました。
    変更してみましたが同様でした。
    適当なサイズのrectをセットしDT_NOCLIPを使用しない場合でも回転方向に関しては変わりはないようです。
    (クリッピングされるので一部隠れますが・・・)

    ありがとうございました。

    2015年4月26日 23:51