【问题标题】:How to stroke text when drawing it with DrawString function in GDI+?在 GDI+ 中使用 DrawString 函数绘制文本时如何描边?
【发布时间】:2017-07-09 09:50:33
【问题描述】:

有一个 GDI 的 StrokePath API 可以允许使用 this method 模拟文本的“描边”。我把它复制到这里:

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 函数来绘制文本。

有谁知道在 GDI+ 中是否有替代 BeginPathEndPathStrokePath 来模拟文本描边?

编辑: 按照下面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);

产生了相当锯齿状的轮廓(放大截图):

知道如何使用抗锯齿进行渲染吗?

【问题讨论】:

    标签: c++ windows winapi gdi+ gdi


    【解决方案1】:

    我相信我们的代码会创建一个GraphicsPath 对象,调用GraphicsPath::AddString() 来获取文本的路径,然后使用Graphics::DrawPath() 绘制路径。

    更新:

    根据块状文字,我进行了实验,认为这看起来更流畅一些。

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

    【讨论】:

    • 嗯。有趣的。谢谢。只是好奇是否有办法为正在绘制的笔添加抗锯齿。它看起来很厚实。
    • 查看我们的代码,我们似乎使用 SetInterpolationMode(InterpolationModeHighQualityBicubic) 在 Graphics 对象上设置了它,并且在我们调用 graphics->SetTextRenderingHint(TextRenderingHintAntiAlias) 之前有一条关于解决“块状文本”的评论:-) ) 然后 SetPixelOffsetMode(PixelOffsetModeNone)
    • 你知道它没有改变任何东西。请参阅我更新后的带代码的原始帖子。
    • 更新了我的答案 - 我认为它更接近你所追求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多