Нужно ли вызывать SelectObject () для восстановления объекта, полученного с помощью GetStockObject ()? - PullRequest
2 голосов
/ 08 апреля 2020

Я использую MF C ...

Когда я создаю новый bru sh, я знаю, что мне нужно восстановить старый bu sh с помощью SelectObject:

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

Однако, если я получаю bru sh с помощью GetStockObject (), нужно ли мне его тоже восстанавливать?

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

Я спрашиваю, потому что этот код иногда дает сбой. Я не уверен, что это из-за того, что я не должен сохранять / восстанавливать стоковые предметы, или из-за того, что я привел тип CBru sh*. Если последнее, я думаю, что я должен сохранить / восстановить дескриптор HGDIOBJ:

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

Если первое, я не буду сохранять / восстанавливать предыдущий объект.

1 Ответ

3 голосов
/ 08 апреля 2020

Вы должны всегда 'заключать в скобки' любые операции в контексте устройства с SaveDC() и RestoreDC() функциями-членами объекта CDC :

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 ): хотя отмена выбора 'Stock Objects' GDI может показаться ненужной (в конце концов, некоторые из них будут выбраны по умолчанию), другой код может полагаться на выбрав предыдущий объект (bru sh, в вашем случае); неспособность восстановить этот выбор может, таким образом, привести к сбою этого кода способами, которые почти невозможно отследить.

...