Win32防止屏幕閃爍

在回調函數中處理WM_PAINT消息:

case WM_PAINT:


 PAINTSTRUCT ps;

//得到當前HDC
 HDC hdc = BeginPaint(&ps);
 

//創建內存HDC
 HDC memHDC = CreateCompatibleDC(hdc);

//獲取客戶區大小
 RECT rectClient;
 GetClientRect(&rectClient);

//創建位圖
 HBITMAP bmpBuff = CreateCompatibleBitmap(hdc,RECT_WIDTH(rectClient),RECT_HEIGHT(rectClient));
 HBITMAP pOldBMP = (HBITMAP)SelectObject(memHDC, bmpBuff);

    // draw something
    DrawBackGround(memHDC);

//拷貝內存HDC內容到實際HDC
BOOL tt = BitBlt(hdc, rectClient.left, rectClient.top, RECT_WIDTH(rectClient),
     RECT_HEIGHT(rectClient), memHDC, rectClient.left, rectClient.top, SRCCOPY);

//內存回收
 SelectObject(memHDC, pOldBMP);
 DeleteObject(bmpBuff);
 DeleteDC(memHDC);

 


 EndPaint(&ps);

return 0;

爲防止清除背景而造成的白屏可以在回調函數中截獲WM_ERASEBKGND消息使其什麼也不要做

case WM_ERASEBKGND:

//什麼也不做,返回0使默認窗口回調不再處理這個消息

return 0;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章