나는 MFC 코드를 읽을 수 있지만 아래의 코드와 혼동되었다SelectObject가 두 번 호출되는 이유는 무엇입니까?
void EditView::ResetDefaultFont()
{
HFONT hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
CDC* pDC = GetDC();
CFont* pFont = pDC->SelectObject(CFont::FromHandle(hFont));
pDC->SelectObject(pFont);
::DeleteObject(hFont);
}
왜 CDC 선택 먼저 기본 글꼴 (CFont* pFont = pDC->SelectObject(CFont::FromHandle(hFont));
), 그러나 다시 pFont을 선택?
올바른 내용입니다. Old School Win API 프로그래밍에서 리소스를 공유하는 전역 시스템 개체를 변경할 때 '샌드위치'라는 개념이있었습니다. 특정 글꼴에 대한 글꼴 핸들을 얻은 다음 글꼴을 새 핸들로 설정하면 이전 글꼴 개체 완료되면 다시 놓을 수 있도록 반환됩니다. Windows NT 이전에는 이러한 리소스가 시스템 개체였으며 제한된 수의 GDI 핸들이있었습니다. 프로그래머가 다시 돌려주는 것은 프로그래머의 책임입니다. 이것은 초기 Windows 환경에서 자주 발생하는 문제였습니다. 초기 Petzold 도서는 훌륭한 자료입니다. –
@ Cheers 및 hth. - Alf BCG Control의 BCGPVisualStudioGUIDemo 프로젝트에 있습니다. – Al2O3
@Ruby 주제에서 벗어나지 만 여전히 : 샘플 코드는 정말 품질이 낮습니다. 디바이스 컨텍스트의 폰트를 설정하고 그 변경을 즉시 취소하는 것은 명백한 목적을 제공하지 않는다는 것을 제외하고, 저자는 ** 시스템 제어 ** 객체 ('GetStockObject'에서 리턴 된'hFont')를 삭제하는 것이 좋은 생각이라고 느꼈습니다.). 이 코드의 논리를 지나치게 강조해서는 안됩니다. – IInspectable