4

我正在研究通过 WinAPI C++ 绘制形状我试图用 WM_PAINT 上的一些代码绘制 2 个椭圆:

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HPEN hPen = CreatePen(PS_DASHDOTDOT, 2, NULL);SelectObject(hdc, hPen);
Ellipse(hdc, 100, 200, 400, 400);
Ellipse(hdc, 300, 300, 500, 510);   

DeleteObject(hPen);
EndPaint(hWnd, &ps);

但输出是:

在此处输入图像描述 我期望的结果是两个形状都不在另一个前面。边框是点划线。谁能告诉我我的错误?感谢您的帮助。

4

2 回答 2

4

Ellipse()(像所有 GDI 形状函数一样)使用当前画笔填充形状,这就是您的输出看起来像这样的原因。有关详细信息,请参阅设置笔和画笔颜色

如果您只想要没有填充的椭圆,请首先选择一个空笔刷:

SelectObject( hdc, GetStockObject( NULL_BRUSH ) );

于 2013-04-03T17:48:19.040 回答
3

一个出现在另一个之上,因为您不仅要绘制轮廓,还要填充它。要停止填充,您可以选择“空心画笔”,有时也称为“空画笔”。

HBRUSH hbrOld = SelectObject(hdc, GetStockObject(HOLLOW_BRUSH));
// draw your ellipses here

您只能创建宽度为 1 或 0 的虚线或虚线笔。您使用了 2,因此命令失败。

此外,您应该在删除之前将笔从 DC 中重新选择出来。

于 2013-04-03T17:50:36.253 回答