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

メイリオの場合、GetTextMetricsで取得できるtmInternalLeadingとtmDescentが
妙に大きいということがわかっている。
GetTextMetricsの詳細情報はこちら。
つまり上下方向の余白が広いってことだ。
上の文字描画結果を出すためのソースコードは以下の通り。(VC++)
<pre class="brush: c;">
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では両フォントの大きさがほぼ同じになる。
まだ研究の余地がありそうだ。