2012-12-24 128 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項目,並在衍生自CEditView的類的構造函數中使用標識符ResetDefaultFont。它沒有編譯:沒有這樣的。

所以,

你從哪裏弄來從ResetDefaultFont功能?

+0

這是正確的。在老派的Win API編程中,當改變共享資源的全局系統對象時,出現了「三明治」的概念。獲取了特定字體的字體句柄,然後當您將該字體設置爲該新句柄時,之前的字體對象返回,以便您完成後可以放回原處。在Win NT之前,這些資源是系統對象,並且有少量的GDI句柄。程序員有責任把它們放回去。這是早期Windows世界中常見問題的來源。早期的Petzold書籍是一個很好的資源。 –

+0

@Cheers和hth。 - Alf它來自BCG Control的BCGPVisualStudioGUIDemo項目。 – Al2O3

+0

@Ruby公平的話題,但仍然:示例代碼質量很低。除了設置設備上下文的字體並立即撤消這個改變並沒有明顯的目的之外,作者還認爲刪除一個**系統控制的**對象(從'GetStockObject'返回的'hFont'>是一個好主意) )。你可能不應該太質疑這個代碼背後的理由。 – IInspectable

-2

答案很簡單。 此代碼僅用於獲取DC的當前字體。 如果他們已經將這些代碼放在這些陳述後面,那就很明顯了。

相關問題