2013-04-03 64 views
3

我被WinAPI的C++ 学习绘制形状我试图上WM_PAINT绘制2椭圆一些代码:绘制形状在WinAPI的C++

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); 

但输出是:

enter image description here 结果我期望的是既不是形状是对方的前面。边界是点划线。 任何人都可以告诉我我的错误吗?我很感谢你的帮助。

+1

如果将宽度从2更改为1,则您的虚线可能会奇迹般地出现。从['CreatePen()'](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ dd183509(v = vs.85).aspx)documentation:“如果由nWidth指定的值大于1,则fnPenStyle参数必须为PS_NULL,PS_SOLID或PS_INSIDEFRAME。” PS_DASHDOTDOT描述进一步说明了这一点:“笔具有交替的破折号和双点,这种样式仅在笔宽等于或小于设备单位时才有效。”关于透明度,考虑一下NULL笔刷。 – WhozCraig

+0

@WhozCraig:非常感谢。我懂了。但是有没有什么方法可以让短划线更宽?并可以绘制两种形状相互重叠,但保持2个形状的边界? – suti

+0

自从我使用GDI绘图以来,它已经过去了十多年。我需要一段时间才能回到它。同心椭圆可能是您在较粗线条(一个在另一个内部绘制)中最好的选择。对于重叠区域,这需要我花一分钟来刷新我的头脑。也许是一个地区。 – WhozCraig

回答

3

Ellipse()(与所有GDI形状函数一样)使用当前画笔填充形状,这就是为什么您的输出看起来像这样。有关详情,请参见setting pen and brush colors

如果你只想要一个无填充的椭圆,先选择一个空刷:

SelectObject(hdc, GetStockObject(NULL_BRUSH));

3

一个出现在另一个的上面,因为你不只是画轮廓,却尽显其作为好。要停止填充它,您可以选择一个“空心笔刷”,有时称为“空笔刷”。

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

只能创建点或虚线笔与widths of 1 or 0。你用了2,所以命令失败了。

另外,在删除DC之前,您应该从DC中选择笔。

+0

非常感谢。现在正在工作。 – suti