CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

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

投稿日:2015年9月26日 更新日:

左側が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では両フォントの大きさがほぼ同じになる。
まだ研究の余地がありそうだ。

-ソフト開発
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

PDFiumでPDFを描画したりなんだりできるんだとさ

まずはこちらのネットニュースをご覧あれ。2014年に書かれたものでおもしろいことが書いてある。

no image

ベクタープロレジ大賞

Vectorがやってる、もっとも人気のあったダウンロードソフトを決める賞です。 Vectorと言えば、フリーウェアやシェアウェアをダウンロードできるところで一番有名なところです。窓の杜というところもあ …

no image

random

JavaScriptと格闘してみたよ。 テーマはランダム。 10個の画像の中から、任意の3個の画像をWebサイトに表示する、 ってのが要求仕様。 Math.floor(Math.random() * …

VC2017でWindowsの環境変数を取得する方法

C++のUnicodeプロジェクトにおいて、_wgetenvでWindowsの環境変数が取得できるのはわかる。 こんなソースがあって、ビルドしたらエラーになった。 void CMFCApplicati …

zipcopy Ver1.04リリース

zipcopyをリビジョンアップして、Ver1.04とした。 Ver1.02からなので2回リビジョンアップしている。詳細は以下の通り。 Ver1.03 2019/9/26 ・ファイル削除時の例外エラー …