由于我是Visual C ++的新手,这可能是与选择GDI对象相关的一个非常基本的问题。
以下代码段绘制一个没有边框的浅灰色圆圈。
cPen pen(PS_NULL, 0, (RGB(0,0,0)));
dc.SelectObject(& pen);
CBrush brush (RGB (192,192,192));
dc.SelectObject (&brush);
dc.Ellipse(0,0, 100,100);
我从代码片段中理解的是,首先创建了一个Pen of Object,它的一个NULL Pen会使边框消失,然后画笔会创建一个灰色的圆圈,但dc
如何使用笔,如果它已经使用刷?这有点令人困惑。
如何使用dc.SelectObject()
两次帮助?如果使用实体画笔对象创建一个灰色的圆圈,那么创建笔对象如何帮助,如果在创建画笔对象时它仍然被销毁?这件事究竟有用吗?
答案 0 :(得分:4)
SelectObject函数用于选择五种不同类型的对象到DC
文件说明了这一点
The newly selected object replaces the previous object of the same type
。因此,这意味着您可以毫无问题地选择笔和笔刷,但您无法选择笔两次。
此外,为了避免资源泄漏,您需要选择之前选择的旧笔/画笔
CPen pen(PS_NULL, 0, (RGB(0,0,0)));
CPen *oldPen = dc.SelectObject(& pen);
CBrush brush (RGB (192,192,192));
CBrush *oldBrush = dc.SelectObject (&brush);
dc.Ellipse(0,0, 100,100);
dc.SelectObject(oldPen);
dc.SelectObject(oldBrush);
答案 1 :(得分:1)
DC对象具有当前画笔,当前笔,当前字体等。即,特定类型的当前对象。因此,您可以同时选择笔和笔刷,但不能同时选择两支笔。 SelectObject
在内部看到句柄的类型。
此外,SelectObject
会返回您之前的同一类型的当前对象,选择您提供的句柄时,该对象将被取消选中。您应该保存它并在完成后恢复。