1

由于我是 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 对象,它是一个 NULL Pen,它会使边框消失,然后画笔创建一个灰色圆圈,但是dc如果它已经在使用画笔,如何使用 pen?这有点令人困惑。

使用dc.SelectObject()两次有什么帮助?如果使用实心画笔对象创建一个灰色的圆圈,创建笔对象有什么帮助,如果它在创建画笔对象时被销毁?这东西到底是怎么工作的?

4

2 回答 2

4

SelectObject 函数用于选择五种不同类型的对象进入 DC

  1. 刷子
  2. 字体
  3. 位图和
  4. 地区

该文档指出 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);
于 2012-07-31T06:54:20.307 回答
1

DC对象有当前画笔、当前笔、当前字体等。即特定类型的当前对象。因此,您可以同时选择笔和画笔,但不能同时选择两支笔。SelectObject在内部看到句柄的类型。

此外,SelectObject返回相同类型的先前当前对象,选择您提供的句柄时未选择该对象。您应该保存它并在完成后恢复。

于 2012-07-31T06:54:30.290 回答