寫GDI的時(shí)候,我們經(jīng)常會由于粗心大意,忘記釋放GDI資源,導(dǎo)致GDI句柄泄露。再加上如果單元測試做的不好,就會在產(chǎn)品發(fā)布以后發(fā)生問題。
眾所周知,Windows上對于一個(gè)進(jìn)程允許的最大GDI句柄數(shù)量為9999,如果程序有大量的GDI句柄沒有被及時(shí)回收,那么程序就會表現(xiàn)的不正常。如果這種問題發(fā)生在以前的WINDOWS 98年代,甚至?xí)斐上到y(tǒng)崩潰。
所以,這里我將陸續(xù)記錄一些GDI編程需要注意的地方,作為今后單元測試中的一部分來進(jìn)行:
1、Create()必須Delete(),包括CreateCompatibleDC
2、SelectObject()必須是成對出現(xiàn)
3、"H"打頭的一些GDI句柄,在使用完后要及時(shí)釋放。如::DeleteObject(HBITMAP),::DeleteDC(HDC)等
4、記住一個(gè)原則:自己創(chuàng)建的東西要自己釋放,如GetDC 要 ReleaseDC
5、MFC的GDI有很多問題,使用的時(shí)候要非常小心。建議最好直接用SDK寫。使用WTL中的GDI也是一個(gè)不錯(cuò)的選擇。WTL中有些GDI對象在聲明的時(shí)候就可以決定是由析構(gòu)函數(shù)來幫你釋放,還是由你自己釋放,非常方便。