使用GDI(C ++)绘制带有轮廓的DrawText

时间:2017-05-30 14:38:59

标签: c++ winapi gdi

我使用此代码从网络摄像头签名框架:

Font = CreateFont(18, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH, "times");

...

HDC hDC = CreateCompatibleDC(NULL);
unsigned char * img = 0;
HBITMAP hBitmap = CreateDIBSection(hDC, &BMI, DIB_RGB_COLORS, (void**)&img, NULL, 0);
memcpy(img, CameraFrame.data, CameraFrame.size());
free(CameraFrame.data);
CameraFrame.data = img;
SelectObject(hDC, hBitmap);
SelectObject(hDC, Font);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(255,255,255));
string Text = "Test";
DrawTextA(hDC, Text.c_str(), Text.size(), &rect, DT_CENTER | DT_WORDBREAK);
DeleteDC(hDC);

当然,帧的色阶会有所不同,我还是需要文本可见。

如何使用大纲来DrawText例如,黑色轮廓的白色文字。

3 个答案:

答案 0 :(得分:2)

两种方法:

  • 以黑色绘制文字,但缩小2像素(祝你好运),偏移缩放(-1,-1),然后通常在中心白色。

  • 以黑色绘制文字,但偏移{ (-1,-1), (1,1), (-1,1), (1,-1) },然后在中间以白色绘制。

答案 1 :(得分:1)

使用GDI,只要您使用“大纲”字体(如TrueType或OpenType),就可以使用BeginPath,DrawText,EndPath和StrokeAndFillPath。

  ::BeginPath(ps.hdc);
  RECT rc;
  GetClientRect(&rc);
  ::DrawTextW(ps.hdc, L"Hello", 5, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  ::EndPath(ps.hdc);
  ::StrokeAndFillPath(ps.hdc);

StrokeAndFillPath将使用当前选定的笔作为轮廓,并使用当前选定的笔刷填充它。您可以在BeginPath / EndPath内使用TextOut或其他GDI调用。

您不会像常规文本输出一样获得任何抗锯齿,因此它不会像常规ClearType文本那样清晰。在较大的尺寸,这不是一个大问题。

答案 2 :(得分:0)

以下是我的建议:

  1. 使用带有PS_DASH的CreatePen或ExtCreatePen创建带有虚线样式的自定义笔。
  2. 使用DT_CALCRECT绘制文本并使用您想要的样式来查看文本的实际位置。
  3. 选择将HPEN从#1转换为HDC
  4. 使用MoveToEx和LineTo根据#2中检索到的矩形绘制框架的4条边(根据需要添加一些填充)。示例代码:https://msdn.microsoft.com/en-us/library/windows/desktop/dd145182(v=vs.85).aspx
  5. 初始化时会发生第1步。每次涂漆都会发生步骤2-4。