So-net無料ブログ作成
検索選択

メイリオが他のフォントとくらべて小さく表示される件 [ソフト開発]

左側がMS Pゴシックで、右側がメイリオ。
高さを同じ80pixcelで書いているのに、メイリオは3割型小さくなる。
メイリオサンプル

メイリオの場合、GetTextMetricsで取得できるtmInternalLeadingとtmDescentが
妙に大きいということがわかっている。
GetTextMetricsの詳細情報はこちら。
つまり上下方向の余白が広いってことだ。

上の文字描画結果を出すためのソースコードは以下の通り。(VC++)
void CTextOutTestView::OnDraw(CDC* pDC)
{
	CTextOutTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// MS Pゴシック
	CFont font1;
	font1.CreateFont(80,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH,_T("MS Pゴシック"));
	CFont* pBack = pDC->SelectObject( &font1 );
	pDC->SetTextAlign( TA_LEFT | TA_BASELINE );
	pDC->TextOutW( 0, 100, _T("あ亜ay") );
	pDC->SelectObject( pBack );

	// メイリオ
	CFont font2;
	font2.CreateFont(80,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH,_T("メイリオ"));
	pBack = pDC->SelectObject( &font2 );
	pDC->SetTextAlign( TA_LEFT | TA_BASELINE );
	pDC->TextOutW( 250, 100, _T("あ亜ay") );
	pDC->SelectObject( pBack );

	// ベースライン
	pDC->MoveTo( 0, 100 );
	pDC->LineTo( 500, 100 );
}

カギになるのはCreateFontらしい。
CreatePointFontを使うと、MS Pゴシックとメイリオで同じくらいの大きさになる。
また、CreateFontでも高さにマイナス値を設定しても同じくらいになる。
以下の計算をした結果をCreateFontの第1引数にセットするということ。
::MulDiv(ptsize,-GetDeviceCaps(LOGPIXELSY),72)
つまり、文字高さはピクセルじゃなくてポイントで指定しろってことか。。。

この手の問題が世のアプリで多く出ているんじゃないかと思ったが、そうでもない。
ちなみにWordやExcelでは両フォントの大きさがほぼ同じになる。
まだ研究の余地がありそうだ。
nice!(2)  コメント(0)  トラックバック(0) 

nice! 2

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。