2.2.12
取消对GDI对象的选定
void CMainWindow::OnPaint
{
CPaintDC dc(this);
CBrush brush(RGB(255, 0, 0));
dc.SelectObject(&brush);
dc.Ellipse(0, 0, 200, 100);
}
析构顺序:先Cbrush再Cpaint;
大部分windows编程人员习惯上首先保存每种对象类型首次调用SelectObject时返回的指针,然后用这个指针重选默认对象。
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
CPen *pOldPen = dc.SelectObject(&pen);
CBrush brush(RGB(255, 0, 0));
CBrush* pOldBrush = dc.SelectObject(&brush);
.
.
.
dc.SelectObject(pOldPen);
dc.SelectObject(pOldBrush);
还有一种同样有效的方法是将备用对象选入设备描述表以取代之前选入的对象。
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
dc.SelectObject(&pen);
CBrush brush;
dc.SelectObject(&brush);
.
.
.
dc.SelectStockObject(BLACK_PEN);
dc.SelectStockObject(WHITE_PEN);
取消选定选入的GDI对象而实现清除设备描述表仍然是windows编程中的惯例。
在堆上创建和删除画笔画刷。
CPen *pen = new CPen(PS_SOLID, 1, RGB(255, 0, 0));
CPen *pOldPen = dc.SelectObject(pen);
dc.SelectObject(pOldPen);
delete pen;
有可能想到这样一条语句去取消选定并删除该画笔:
Delete dc.SelectObject(pOldPen);
这种方法对画笔有用,对画刷不管用。因为同时创建两个画刷时,它们共用一个HBRUSH。