lfOrientationのみ使用したフォントの生成について

[戻る]
ぶいしー 2008/10/17(金) 10:26:45
WindowsXP,VC6.0 sp6です。

以下のようなフォントの生成を生成してテキストを描画したのですが、
指定座標(下の場合は(0,0))から描画しれくれず、ずれて描画されてしまいます。
上下方向は、たぶん、文字幅の半分の大きさでずれているようなのですが、
左右方向が、どのくらいずれるのか見当がつきません。

もし、詳しい方、教えて頂きたいのですが、、。
よろしくお願いいたします。

※ あまりしないかもしれませんが、
   lfEscapmemet=0,lfOrientaion=900として、文字を左側に倒したいのです。
   (丁度、縦文字列を横に倒したような描画にしたい。)

void CTESTView::OnDraw(CDC* pDC)
{
    CTESTDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: この場所にネイティブ データ用の描画コードを追加します。

    // LOGFONT構造体の設定
    LOGFONT logfont;
    ZeroMemory(&logfont, sizeof(logfont));
    logfont.lfHeight = -1500; 
    logfont.lfWidth  = 0;
    logfont.lfEscapement = 0;
    logfont.lfOrientation = 900;
    logfont.lfWeight = FW_DONTCARE;
    logfont.lfItalic = FALSE;
    logfont.lfUnderline = FALSE;
    logfont.lfStrikeOut = FALSE;
    logfont.lfCharSet = SHIFTJIS_CHARSET;
    logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
    logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS | CLIP_LH_ANGLES;
    logfont.lfQuality = DEFAULT_QUALITY;
    logfont.lfPitchAndFamily = FF_DONTCARE | DEFAULT_PITCH;
    _tcscpy(logfont.lfFaceName, _T("MS ゴシック"));

    // フォントの生成
    CFont font;
    font.CreateFontIndirect(&logfont);
    CFont* pOldFont = pDC->SelectObject(&font);

    // マッピングモード設定
    int nMMX  = pDC->GetDeviceCaps(HORZSIZE);
    int nMMY  = pDC->GetDeviceCaps(VERTSIZE);
    int nDevX = pDC->GetDeviceCaps(HORZRES);
    int nDevY = pDC->GetDeviceCaps(VERTRES);
    pDC->SetMapMode(MM_ISOTROPIC);
    pDC->SetWindowExt(nMMX * 100, nMMY * 100);

    // 詳細グラフィックモード設定
    ::SetGraphicsMode(pDC->GetSafeHdc(), GM_ADVANCED);

    pDC->SetTextAlign(TA_LEFT | TA_TOP | TA_NOUPDATECP);
    CString str = _T("12345");
    pDC->TextOut(0, 0, str);

    pDC->SelectObject(pOldFont);
    font.DeleteObject();
}

仲澤@失業者 2008/10/17(金) 14:09:42
これはよくわかりませんねぇ。
実験してみると、lfOrientation=900の場合

1.0度の場合の左肩を原点とする
2.0度の場合の文字の下端線分を、原点を中心に左に90度回転した
  線分をLとする
3.線分Lと原点からの水平線の交点をPとする
4.点PのXを、表示時のX開始位置とする
5.点PのYを、表示時の文字の中心線する

の様に見えますね。

文字のサイズを40[pixl]、マップモードをMM_TEXT、
Windowエクステント、ビューポートエクステントを指定せずに、
文字の表示位置を(100,100)、文字列を"AB"でやってみてください。
そのときpDC->GetTextExtent( str)すれば、文字の占有サイズが
取得できます。この値を元に矩形を書くとわかりやすいです。
900の場合cx,cyが反転するので注意が必要ですが。

ぶいしー 2008/10/29(水) 17:06:47
テキストメトリックス情報を取得して、何とか
ずれの情報をつかもうとしたのですが、よく分かりませんでした。

TEXTMETRIC tm;
pMetaFileDC->GetTextMetrics(&tm);

OUTLINETEXTMETRIC otm;
pMetaFileDC->GetOutlineTextMetrics(sizeof(otm), &otm);

以下のように文字配置をTA_TOP→TA_BASELINEとすると、
pDC->SetTextAlign(TA_LEFT | TA_BASELINE | TA_NOUPDATECP);

また、違ったずれになります。

何かヒントになることがありましたら、お願いいたします。

古いスレッドには追加発言できません。