2012-08-28 50 views
2

MSDN和衆多帖子都提示BeginPaint/EndPaint應該在WM_PAINT中使用。我還看到許多地方暗示如果在繪畫中使用雙緩衝,則在WM_CREATE中初始化DC和mem分配並在WM_PAINT中重新使用這些句柄更有意義。GetDC vs BeginPaint性能注意事項

例如,使用BeginPaint的,我經常看到:

case WM_PAINT: 
hdc = BeginPaint(hWnd, &ps); 
MemDC = CreateCompatibleDC(hdc); 
bmp = CreateCompatibleBitmap(hdc, width, height); 
oldbmp = SelectObject(MemDC,bmp); 
g = new Graphics(MemDC); 

//do paint on bmp 
//blt bmp back to hdc 

EndPaint(hWnd, &ps); 
DeleteObject(bmp); 
g->ReleaseHDC(MemDC); 
DeleteDC(MemDC); 
delete g; 

要保存初始化和拆除,是有可能做到這一點:

case WM_CREATE: 
hdc = GetDC(hWnd); 
//create memDC and graphics object references ... 
case WM_DESTROY 
//delete memDC and graphics object references... 
case WM_PAINT 
BeginPaint(hWnd, &ps); 
//use previously create mem and graphics object to paint 
EndPaint(hWnd, &ps); 

所以我們只用調用EndPaint清除更新區域,但將圖形委託給prev創建的對象。

回答

5

不,這是一個非常糟糕的做法。這首先由設備上下文有錯誤的剪輯區域出錯,當用戶調整窗口大小時,無法正確繪製窗口。

第二個問題是更新區域剪裁不會生效,PAINTSTRUCT.rcPaint。防止當更新區域只是窗口的一部分時Windows可能自動執行的任何可能的繪畫優化。

第三個問題是您無需操作系統資源。所有GDI對象都分配在一個堆中,該堆由同一桌面上運行的所有進程共享。

創建HDC非常便宜,可以在需要時創建它。更不用說PAINTSTRUCT.hdc,您可以在拼盤上投放,隨時可以使用。

+0

謝謝。這很有幫助 – dave