我是否需要调用 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' 可能 似乎 没有必要(毕竟,会有几个默认情况下选择的这些),其他代码可能依赖于选择先前的对象(在您的情况下为画笔);因此,无法恢复此选择可能会导致该代码以几乎无法追踪的方式失败。
我正在使用 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' 可能 似乎 没有必要(毕竟,会有几个默认情况下选择的这些),其他代码可能依赖于选择先前的对象(在您的情况下为画笔);因此,无法恢复此选择可能会导致该代码以几乎无法追踪的方式失败。