Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2010, 19:55   #1
noxin
Пользователь
 
Регистрация: 24.03.2010
Сообщений: 38
По умолчанию Win Api: использование метода двойной буферизации для динамической графики(избавление от мерцания)

Добрый вечер. Не знаю как избавиться от мерцания при передвижении картинки.

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	static int XCursor,YCursor;
	static HBITMAP hBitmap;
	static int cx,cy;
	static BITMAP bmp;
	static bool flag = false;
	HDC Mhdc;
	static HBITMAP hBit;
	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_TIMER:
		{
			InvalidateRect(hWnd,NULL,true);
			KillTimer(hWnd,1);
		}	
		break;
	case WM_CREATE:
		{
			HINSTANCE hIns = GetModuleHandle(NULL);
			hBitmap = (HBITMAP)LoadImage(hIns,L"remapped.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
			if (hBitmap == NULL)
			{
				MessageBox(hWnd,L"картинки нет",L"",MB_OK);
				break;
			}
     		GetObject(hBitmap, sizeof(bmp), &bmp); 
 			hdc = GetDC(hWnd);
			RECT rect;
			GetClientRect(hWnd,&rect);
			XCursor = rect.right/2;
			YCursor = rect.bottom/2;
			cx = XCursor;
			cy = YCursor;
			ReleaseDC(hWnd,hdc);
			SetTimer(hWnd,1,1000,NULL);
		}
		break;
	case WM_LBUTTONDOWN:
		{
			XCursor = LOWORD(lParam);
			YCursor = HIWORD(lParam); 
			if ((XCursor>=cx) && (XCursor<=(cx+bmp.bmWidth)) && (YCursor>=cy) && (YCursor<=(cy+bmp.bmHeight)))
			{
				flag = true; 
			}
 	
		}
		break;

	case WM_MOUSEMOVE:
		{
			if (flag)
			{
				XCursor = LOWORD(lParam);
				YCursor = HIWORD(lParam);
				cx = XCursor;
				cy = YCursor;
				InvalidateRect(hWnd,NULL,true);
			}
		}
		break;
	
	case WM_LBUTTONUP:
		{
			flag = false;
		}
		break;
	case WM_PAINT:
		{
			hdc = BeginPaint(hWnd, &ps);

			HDC Mhdc = CreateCompatibleDC(hdc);
			HBITMAP hBit = CreateCompatibleBitmap(Mhdc,bmp.bmHeight,bmp.bmWidth);
			HANDLE hSO = SelectObject(Mhdc,hBit);			
			BitBlt(hdc, XCursor, YCursor, bmp.bmHeight, bmp.bmHeight, Mhdc, 0, 0, SRCCOPY);
			SelectObject(Mhdc,hSO);
			DeleteObject(hBit);
			DeleteDC(Mhdc);
			EndPaint(hWnd, &ps);
		}
		break;
	case WM_DESTROY:

		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Если чем помог, оставьте отзыв...
noxin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование метода двойной буферизации для динамической графики(избавление от мерцания) noxin Win Api 1 05.04.2010 20:08
WIN API для получения списка? YaroslavKh Win Api 10 12.02.2010 00:02
Использование API функций в Delphi (нужна инфа для курсовой) Abask Win Api 4 25.12.2008 01:56
Рисование графики на Win Api помогите exolot128 Помощь студентам 12 08.10.2007 15:24