2012-05-23 52 views
1

在我的程序中我有一個內存DC,我頻繁繪製,然後在響應WM_PAINT我快速BitBlt它到屏幕上。我一直在做這樣的繪圖,內存DC是根據WM_CREATE順便創建的。SelectObject對內存DC

void Draw() 
{ 
    HFONT hPrevFont = (HFONT)SelectObject(m_hMemDC, m_hFont); 
    // draw text 
    SelectObject(m_hMemDC, hPrevFont); 
} 

這應該是正確的,我現在也發現了,我可以使用該SaveDCRestoreDC

void Draw() 
{ 
    int nSavedDC = SaveDC(m_hMemDC); 
    SelectObject(m_hMemDC, m_hFont); 
    // draw text 
    RestoreDC(m_hMemDC, nSavedDC); 
} 

現在我不知道是否(有很多GDI對象時特別有用)可以在創建完成後保存DC的狀態,並在刪除時恢復它。像這樣:

int OnCreate(...) 
{ 
    m_hMemDC = CreateMemDC(); 
    m_nSavedDC = SaveDC(m_hMemDC); 
} 

void Draw() 
{ 
    SelectObject(m_hMemDC, m_hFont); 
    // draw text 
} 

void OnDestroy() 
{ 
    RestoreDC(m_hMemDC, m_nSavedDC); 
    DeleteMemDC(m_hMemDC); 
} 

這應該沒問題我想,這不像其他人在同時使用我的記憶DC。你怎麼看?

哎呀,在這種情況下甚至有必要保存和恢復DC?

編輯:是的,我知道我應該刪除字體之前先刪除內存DC(因爲否則它仍然會被內存DC使用)。

回答

2

危險之處在於,您可能會將選中的對象留在您的內存DC中,但一次只能由一個DC使用。傳統上,您在Draw循環結束時取消選擇DC以外的對象,以便該對象可以選擇到另一個DC中。如果你延遲取消選擇,那麼沒有其他人可以使用該對象,因爲它仍然在你的DC中。

+0

謝謝,所以當我確信這些對象沒有在其他地方使用它沒關係(他們是班級的私人成員,所以沒問題)。我還注意到,在調用DeleteObject時,如果它沒有刪除對象,它並不總是返回零,因爲它仍然被選入DC,非常奇怪。 – demorge

0

我沒有看到這個問題。 至於恢復您的DC,我認爲如果您不恢復默認對象,可能由不正確的引用計數創建內存泄漏。這只是基於Microsoft文檔的猜測。

+0

是的MSDN上的文檔在這個問題上是非常有限的... – demorge

相關問題