我在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?
這是正確的。在老派的Win API編程中,當改變共享資源的全局系統對象時,出現了「三明治」的概念。獲取了特定字體的字體句柄,然後當您將該字體設置爲該新句柄時,之前的字體對象返回,以便您完成後可以放回原處。在Win NT之前,這些資源是系統對象,並且有少量的GDI句柄。程序員有責任把它們放回去。這是早期Windows世界中常見問題的來源。早期的Petzold書籍是一個很好的資源。 –
@Cheers和hth。 - Alf它來自BCG Control的BCGPVisualStudioGUIDemo項目。 – Al2O3
@Ruby公平的話題,但仍然:示例代碼質量很低。除了設置設備上下文的字體並立即撤消這個改變並沒有明顯的目的之外,作者還認爲刪除一個**系統控制的**對象(從'GetStockObject'返回的'hFont'>是一個好主意) )。你可能不應該太質疑這個代碼背後的理由。 – IInspectable