lfOrientationのみ使用したフォントの生成について – プログラミング – Home

lfOrientationのみ使用した...
 
通知
すべてクリア

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


ぶいしー
 ぶいしー
(@ぶいしー)
ゲスト
結合: 17年前
投稿: 19
Topic starter  

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


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

これはよくわかりませんねぇ。
実験してみると、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が反転するので注意が必要ですが。


返信引用
ぶいしー
 ぶいしー
(@ぶいしー)
ゲスト
結合: 17年前
投稿: 19
Topic starter  

テキストメトリックス情報を取得して、何とか
ずれの情報をつかもうとしたのですが、よく分かりませんでした。

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

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました