---
title: "BitBlt med synkronisering (Slippa flimmer) ??"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/39097-bitblt-med-synkronisering-slippa-flimmer"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "JimmyPalm"
published: "2002-03-06T14:48:00.000Z"
updated: "2002-03-07T07:43:25.000Z"
replies: 4
views: 419
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/39097-bitblt-med-synkronisering-slippa-flimmer"
---

# BitBlt med synkronisering (Slippa flimmer) ??

## #1 — JimmyPalm, 2002-03-06T14:48Z

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);
}
```

Permalänk: https://www.webforum.nu/p/39097

## #2 — Toonster, 2002-03-06T15:47Z

Vad jag kan se så använder du redan dubbelbuffring...
hdc och hdcbuff
/T

Permalänk: https://www.webforum.nu/p/617525

## #3 — JimmyPalm, 2002-03-06T17:35Z

Oki

Oki!

Problemet är att jag Blittar grafik när JAG känner för det.. inte när det är mest lämpligt för HÅRDVARAN...Man bör nämligen blitta och SAMTIDIGT låta skärmen ritas om HELT innan man blittar igen.

Frågan är alltså... hur får man reda på om skärmen är redo eller inte?

Permalänk: https://www.webforum.nu/p/617579

## #4 — Reza, 2002-03-07T02:13Z

En lösning för att bli av med flimret är att inte låta DefWindowProc radera bakgrunden.
Detta gör du genom att helt enkelt processa WM_ERASEBKGND och returnera icke noll värde från meddelandet.

```
case WM_ERASEBKGND:
{
        return (LRESULT)1; 
}
```

Permalänk: https://www.webforum.nu/p/621127

## #5 — JimmyPalm, 2002-03-07T07:43Z

Min favvo elev!!

Hehehe!!

Reza är min favvo elev!!

Permalänk: https://www.webforum.nu/p/621143

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/39097-bitblt-med-synkronisering-slippa-flimmer
