我是否需要调用 SelectObject() 来恢复使用 GetStockObject() 检索的对象?

Do I need to call SelectObject() to restore a object retreived with GetStockObject()?

我正在使用 MFC...

当我创建新画笔时,我知道我需要使用 SelectObject 恢复旧的灌木丛:

CBrush brushFill;
brushFill.CreateSolidBrush(colorFill);
CBrush *oldBrush = pDC->SelectObject(&brushFill);
// Draw something here.
pDC->SelectObject(oldBrush);

但是,如果我使用 GetStockObject() 获取画笔,是否也需要恢复它?

CBrush *oldBrush = (CBrush *)pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));
// Draw something here.
pDC->SelectObject(oldBrush);

我问,因为该代码偶尔会崩溃。我不确定这是因为我不应该 save/restore 库存物品,还是我对 CBrush* 的类型转换。如果是后者,我想我应该 save/restore 一个 HGDIOBJ 句柄:

HGDIOBJ oldBrush = pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));
// Draw something here.
pDC->SelectObject(oldBrush);

如果是前者,我就不会save/restore上一个对象了

您应该始终 'bracket' 使用 CDC 对象的 SaveDC() and RestoreDC() 成员函数对设备上下文进行的任何操作:

int DCsave = pDC->SaveDC(); // Saves all (or most) settings and object selections
// ... Do your drawing operations, etc.
pDC->RestoreDC(DCsave);     // Restores the saved state and all selected objects

此外,仅供参考,您可能会发现 SelectStockObject() 成员更易于使用:

pDC->SelectStockObject(HOLLOW_BRUSH);

注意(来自 IInspectable 的评论):虽然取消选择 GDI 'Stock Objects' 可能 似乎 没有必要(毕竟,会有几个默认情况下选择的这些),其他代码可能依赖于选择先前的对象(在您的情况下为画笔);因此,无法恢复此选择可能会导致该代码以几乎无法追踪的方式失败。