2012-12-24 4 views
0

나는 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을 선택?

답변

1

첫 번째 SelectObject 호출은 장치 컨텍스트에서 선택한 글꼴을 변경합니다.

두 번째 SelectObject 호출은 첫 번째 호출 이전의 글꼴로 재설정합니다.

두 번째 호출에 대한 "이유"에 대한 답변은 나와 있지만 전체 호출 시퀀스를 수행하는 시점이 무엇인지는 알지 못합니다. ResetDefaultFont에 대한 문서 결과가 없으며 MSDN Library 나 로컬 Visual Studio 2012 도움말에서도 온라인으로 찾을 수 없습니다. 그냥 철저하게 VS 2012에서 새 기본 MFC 프로젝트를 만들고 ResetDefaultFontCEditView에서 파생 된 클래스의 생성자에서 식별자를 사용했습니다. 그것은 컴파일되지 않았습니다.

따라서는,

은 어디셨어요 에서 ResetDefaultFont 기능이?

+0

올바른 내용입니다. Old School Win API 프로그래밍에서 리소스를 공유하는 전역 시스템 개체를 변경할 때 '샌드위치'라는 개념이있었습니다. 특정 글꼴에 대한 글꼴 핸들을 얻은 다음 글꼴을 새 핸들로 설정하면 이전 글꼴 개체 완료되면 다시 놓을 수 있도록 반환됩니다. Windows NT 이전에는 이러한 리소스가 시스템 개체였으며 제한된 수의 GDI 핸들이있었습니다. 프로그래머가 다시 돌려주는 것은 프로그래머의 책임입니다. 이것은 초기 Windows 환경에서 자주 발생하는 문제였습니다. 초기 Petzold 도서는 훌륭한 자료입니다. –

+0

@ Cheers 및 hth. - Alf BCG Control의 BCGPVisualStudioGUIDemo 프로젝트에 있습니다. – Al2O3

+0

@Ruby 주제에서 벗어나지 만 여전히 : 샘플 코드는 정말 품질이 낮습니다. 디바이스 컨텍스트의 폰트를 설정하고 그 변경을 즉시 취소하는 것은 명백한 목적을 제공하지 않는다는 것을 제외하고, 저자는 ** 시스템 제어 ** 객체 ('GetStockObject'에서 리턴 된'hFont')를 삭제하는 것이 좋은 생각이라고 느꼈습니다.). 이 코드의 논리를 지나치게 강조해서는 안됩니다. – IInspectable

-2

답변은 간단합니다. 이 코드는 DC의 현재 글꼴을 가져 오는 것입니다. 이 문장을 따라 코드를 작성했다면 분명했을 것입니다.

관련 문제