none
GDI+のDrawStringで文字間隔は調整できますか RRS feed

  • 質問

  • DrawStringを使用して描画をした結果、
    96dpiの画面での表示と300dpiのプリンターへの印刷結果で文字の間隔が異なりました。

    フォントサイズや描画領域は高DPIに合わせた処理を実装しています。
    96dpiと300dpiで比較すると、300dpiの方が文字間隔が少し狭く見えます。

    GDI+のDrawStringは常に96dpiとして文字間隔を設定しているのでしょうか?
    ご存知の方いらしたら教えてください。

    ### 該当のソースコード


    ```C++
    Gdiplus::Graphics graphics(*pDC);

    //Setting
    graphics.SetPageUnit(Gdiplus::UnitPixel);
    graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
    graphics.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
    Gdiplus::StringFormat format = Gdiplus::StringFormat::GenericDefault();

    //Font
    LOGFONT font;
    memset(&font, 0, sizeof(LOGFONT));
    font.lfHeight = 14;
    font.lfWeight = 0;
    font.lfEscapement = 0;
    font.lfOrientation = 0;
    font.lfWeight = m_fontStyle.isBold ? FW_BOLD : FW_NORMAL;
    font.lfItalic = m_fontStyle.isItalic ? TRUE : FALSE;
    font.lfUnderline = m_fontStyle.isUnderLine ? TRUE : FALSE;
    font.lfStrikeOut = 0;
    font.lfCharSet = DEFAULT_CHARSET;
    font.lfOutPrecision = OUT_TT_ONLY_PRECIS;
    font.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    font.lfQuality = CLEARTYPE_QUALITY;
    font.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
    Gdiplus::Font fontF(*pDC, &font);

    //Rect
    Gdiplus::RectF rectF((REAL)bounds.x, 
                 (REAL)bounds.y, 
                         (REAL)(bounds.width != 0 ? bounds.width : 0.0001), 
                         (REAL)(bounds.height != 0 ? bounds.height : 0.0001));

    //Draw
    //font.lfHeightやrectFは印刷時には高DPIに合わせてサイズを変更しています
    graphics.DrawString((const wchar_t*)m_text, -1, &fontF, rectF, &format, &brush);
    ```

    ### 補足情報

    VC++ 2012で開発

    2019年12月16日 2:52

回答

  • TaiseiTarouさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    GDI +ではサポートされていません。
    各文字を個別に描画するか(正しく処理するのが難しい)、文字列にスペースを自分で挿入する必要があります。
    Graphics.ScaleTransform()を使用して文字を引き伸ばすことはできますが、それは見苦しいです。
    または、GDIメソッドSetTextCharacterExtraを使用して文字間スペースを設定する(GDI + DrawStringと同時に使用することはできません)か、直接ExtTextOutを使用します。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク TaiseiTarou 2019年12月25日 6:29
    2019年12月19日 1:22
    モデレータ