2017-02-20 31 views
1

StrokePath APIがあり、this methodを使用してテキストの「ストローク」をシミュレートすることができます。私はここでそれをコピーします:GDI +でDrawString関数を使用してテキストを描画するときにテキストを筆跡表示する方法は?

void CCanvas::DrawOutlineText(CDC& dc, const CString& Text) 
{ 
    const int RestorePoint = dc.SaveDC(); 

    // Create new font 
    CFont NewFont; 
    NewFont.CreatePointFont(700, TEXT("Verdana"), &dc); 

    // Use this font 
    dc.SelectObject(&NewFont); 

    // Brush for pen 
    LOGBRUSH lBrushForPen = { 0 }; 
    lBrushForPen.lbColor = RGB(200, 150, 100); 
    lBrushForPen.lbHatch = HS_CROSS; 
    lBrushForPen.lbStyle = BS_SOLID; 

    // New pen for drawing outline text 
    CPen OutlinePen; 
    OutlinePen.CreatePen(PS_GEOMETRIC | PS_SOLID, 2, &lBrushForPen, 0, 0); 

    // Use this pen 
    dc.SelectObject(&OutlinePen); 

    dc.SetBkMode(TRANSPARENT); 

    dc.BeginPath(); 
    // This text is not drawn on screen, but instead each action is being 
    // recorded and stored internally as a path, since we called BeginPath 
    dc.TextOut(20, 20, Text); 
    // Stop path 
    dc.EndPath(); 

    // Now draw outline text 
    dc.StrokePath(); 

    dc.RestoreDC(RestorePoint); 
} 

私の場合は、テキストを描画するGDI +からDrawString機能を使用しています。

テキストストロークをシミュレートするために、BeginPathEndPathStrokePathの代替品がGDI +に存在するかどうか知りませんか?

EDIT:以下jschroedlによってアドバイスに従い、私は次のことを試してみました:かなりギザギザの輪郭(拡大スクリーンショット)生産

CString str = L"Text"; 

Graphics grpx(dc.GetSafeHdc()); 

SolidBrush gdiBrush(Color(0xFF, 0xFF, 0, 0)); 

StringFormat gdiSF; 
gdiSF.SetAlignment(StringAlignmentNear); 
gdiSF.SetFormatFlags(StringFormatFlagsNoWrap | StringFormatFlagsNoFitBlackBox | 
    StringFormatFlagsNoFontFallback | StringFormatFlagsNoClip); 
gdiSF.SetHotkeyPrefix(HotkeyPrefixNone); 
gdiSF.SetTrimming(StringTrimmingNone); 

grpx.SetTextRenderingHint(TextRenderingHintAntiAlias); 
grpx.SetPixelOffsetMode(PixelOffsetModeNone); 
grpx.SetInterpolationMode(InterpolationModeHighQualityBicubic); 

GraphicsPath dd; 
FontFamily gdiFF(L"Segoe UI"); 
const PointF pntF(0, 0); 
dd.AddString(str, str.GetLength(), &gdiFF, FontStyleRegular, 58.0f, pntF, &gdiSF); 

Pen penFF(Color(0xFF, 0xFF, 0, 0), 1.0f); 
grpx.DrawPath(&penFF, &dd); 

enter image description here

アンチエイリアスでレンダリングする方法はありますか?

答えて

0

私たちのコードはGraphicsPathオブジェクトを作成し、GraphicsPath::AddString()を呼び出してテキストのパスを取得し、後でGraphics::DrawPath()というパスを描画します。

更新:ブロッキーテキストに基づいて

、私は実験と、これは少し滑らかに見えると思います。

grpx.SetTextRenderingHint(TextRenderingHintClearTypeGridFit); 
grpx.SetSmoothingMode(SmoothingModeHighQuality); 
grpx.SetPixelOffsetMode(PixelOffsetModeHalf); 

enter image description here

+0

うーん。面白い。ありがとう。描画されているペンにアンチエイリアスを追加する方法があるかどうか不思議です。それはかなりチャッキーに見えます。 – c00000fd

+0

私たちのコードを見ると、SetInterpolationMode(InterpolationModeHighQualityBicubic)を使ってGraphicsオブジェクトに設定しているようですが、Graphics-> SetTextRenderingHint(TextRenderingHintAntiAlias)とSetPixelOffsetMode(PixelOffsetModeNone)を呼び出す直前に「ブロックテキスト」を扱うコメントがあります。 – jschroedl

+0

あなたは何も変わっていないことを知っています。私の更新された元の投稿コードを参照してください。 – c00000fd

関連する問題