Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在GDI+;中使用DrawString函数绘制文本时如何对其进行笔划;?_C++_Windows_Winapi_Gdi+_Gdi - Fatal编程技术网

C++ 在GDI+;中使用DrawString函数绘制文本时如何对其进行笔划;?

C++ 在GDI+;中使用DrawString函数绘制文本时如何对其进行笔划;?,c++,windows,winapi,gdi+,gdi,C++,Windows,Winapi,Gdi+,Gdi,有一个GDI的API,可以使用它来模拟文本的“笔划”。我会复制到这里: void CCanvas::DrawOutlineText( CDC& dc, const CString& Text ) { const int RestorePoint = dc.SaveDC(); // Create new font CFont NewFont; NewFont.CreatePointFont( 700, TEXT( "Verdana" ), &dc );

有一个GDI的API,可以使用它来模拟文本的“笔划”。我会复制到这里:

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+中的函数来绘制文本

有人知道GDI+中是否有一种替代方法来模拟文本笔划,而不是
BeginPath
EndPath
StrokePath

编辑:根据下面的
jschroedl
建议,我尝试了以下方法:

这产生了相当参差不齐的轮廓(放大的屏幕截图):


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

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

更新:

基于块状文本,我进行了实验,认为这看起来有点平滑

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

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

更新:

基于块状文本,我进行了实验,认为这看起来有点平滑

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

嗯,很有趣。谢谢只是想知道是否有一种方法可以为正在绘制的画笔添加抗锯齿。它看起来很粗。看看我们的代码,我们似乎使用SetInterpolationMode(InterpolationModeHighQualityBicubic)在图形对象上设置了它,在调用Graphics->SetTextRenderingHintantialias(TextRenderingHintAntiAlias)然后调用SetPixelOffsetMode(PixelOffsetModeNone)之前,有一条关于寻址“块状文本”的注释:-)你知道这没有改变什么。看到我更新的原始帖子w/代码。更新了我的答案-我认为它更接近你想要的。嗯。有趣。谢谢只是想知道是否有一种方法可以为正在绘制的画笔添加抗锯齿。它看起来很粗。看看我们的代码,我们似乎使用SetInterpolationMode(InterpolationModeHighQualityBicubic)在图形对象上设置了它,在调用Graphics->SetTextRenderingHintantialias(TextRenderingHintAntiAlias)然后调用SetPixelOffsetMode(PixelOffsetModeNone)之前,有一条关于寻址“块状文本”的注释:-)你知道这没有改变什么。请看我更新的原始帖子w/代码。更新了我的答案-我认为它更接近你想要的。