Vad jag kan se så använder du redan dubbelbuffring...
hdc och hdcbuff
/T
Hej!
Jag använder mig av tekniken att använda dubbel buffring - dock uppstår ett flimmer med jämna mellanrum. I Direct X så inväntar man en s.k. V-sync innan man blittar backbuffer till frontbuffer. Hur skall man göra i "vanlig" WIN32 miljö?
Tacksam för svar... :)
Nedan följer ett kodexempel:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HINSTANCE hInstance;
static HBITMAP hBitmapGubbe, hBitmapBuff;
static HDC hdcGubbe, hdcBuff;
static POINT ptGubbePos;
switch(message)
{
case WM_CREATE:
{
hInstance = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
hdc = GetDC(hwnd);
hBitmapGubbe = (HBITMAP) LoadImage(hInstance, TEXT("gubbe.bmp"), IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hBitmapBuff = (HBITMAP) CreateCompatibleBitmap(hdc, 400, 200);
ReleaseDC(hwnd, hdc);
SetTimer(hwnd, 1, 50, NULL);
return 0;
}
case WM_TIMER:
{
switch(wParam)
{
case 1:
{
if(ptGubbePos.x < 360)
ptGubbePos.x += 1;
if(ptGubbePos.x >= 360)
ptGubbePos.x = 0;
InvalidateRect(hwnd, NULL, TRUE);
}
}
return 0;
}
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
hdcGubbe = CreateCompatibleDC(hdc);
SelectObject(hdcGubbe, hBitmapGubbe);
hdcBuff = CreateCompatibleDC(hdc);
SelectObject(hdcBuff, hBitmapBuff);
Rectangle(hdcBuff, -1, -1, 400, 200);
BitBlt(hdcBuff, ptGubbePos.x, 0, 66, 77, hdcGubbe, 0, 0, SRCCOPY);
// Visa gubbe:
BitBlt(hdc, 0, 0, 400, 200, hdcBuff, 0, 0, SRCCOPY);
DeleteDC(hdcGubbe);
DeleteDC(hdcBuff);
EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
