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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2012, 14:14   #11
Iosimo
Пользователь
 
Регистрация: 26.03.2012
Сообщений: 10
По умолчанию

Спасибо за пример, буду разбираться
Iosimo вне форума Ответить с цитированием
Старый 09.04.2012, 13:29   #12
Iosimo
Пользователь
 
Регистрация: 26.03.2012
Сообщений: 10
По умолчанию

Можете еще один момент подсказать, рисует у меня в принципе нормально, перерисовывается все верно. однако если раскрыть окно на полный размер, оно позволяет рисовать только в пределах малого окна (размерах которые оно имело при открытии), как я понял это связанно с rect, но ведь я его беру со всей клиентской области
Iosimo вне форума Ответить с цитированием
Старый 09.04.2012, 18:23   #13
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Я ведь привел пример:
Код:
hmemBMP = CreateCompatibleBitmap(descDC, GetSystemMetrics(SM_CXFULLSCREEN), GetSystemMetrics(SM_CYFULLSCREEN));
Цитата:
но ведь я его беру со всей клиентской области
Клиентская область это габариты внутренней части окна без учета шапки, бордюра, полос прокрутки. При создании окна одни габариты, при любом изменении размеров они уже другие.
EUGY вне форума Ответить с цитированием
Старый 09.04.2012, 21:43   #14
Iosimo
Пользователь
 
Регистрация: 26.03.2012
Сообщений: 10
По умолчанию

Код:
hmemBMP = CreateCompatibleBitmap(descDC, GetSystemMetrics(SM_CXFULLSCREEN), GetSystemMetrics(SM_CYFULLSCREEN));
RECT rc = {0,0, GetSystemMetrics(SM_CXFULLSCREEN), GetSystemMetrics(SM_CYFULLSCREEN)};
я попробовал использовать эти строки у себя в программе и у меня при расширении окна, новая область становится вся черная.
Iosimo вне форума Ответить с цитированием
Старый 09.04.2012, 21:51   #15
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
я попробовал использовать эти строки у себя в программе и у меня при расширении окна, новая область становится вся черная.
Не понятно, выложите весь код.
EUGY вне форума Ответить с цитированием
Старый 10.04.2012, 11:16   #16
Iosimo
Пользователь
 
Регистрация: 26.03.2012
Сообщений: 10
По умолчанию

Поигрался, вроде заработало
Код:
int x, y, x2, y2;//ДОЛЖНЫ БЫТЬ
bool bDraw;		//ГЛОБАЛЬНЫМИ 
HBITMAP hDrawingBitmap;
HDC hMemDC;

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   HDC hDC;
   
   HBITMAP hOldBmp;
   HBRUSH hTmpBrush;
   hMemDC = CreateCompatibleDC(NULL);
   
   hInst = hInstance; 

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }


   hDC = GetDC(NULL);
   
  hDrawingBitmap	= CreateCompatibleBitmap(hDC, GetSystemMetrics(SM_CXFULLSCREEN), GetSystemMetrics(SM_CYFULLSCREEN));

  ReleaseDC(hWnd, hMemDC);
   
   hOldBmp = (HBITMAP)SelectObject(hMemDC, hDrawingBitmap);
 RECT   rcClient= {0,0, GetSystemMetrics(SM_CXFULLSCREEN), GetSystemMetrics(SM_CYFULLSCREEN)};
 FillRect(hMemDC, &rcClient,(HBRUSH) GetStockObject(WHITE_BRUSH));

   SelectObject(hMemDC, hOldBmp);
   
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
    
   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	
	hdc = GetDC(NULL);

	switch (message)
	{
case WM_LBUTTONDOWN:
	case WM_RBUTTONDOWN:
		SetCapture(hWnd);
		bDraw = true;
		x = LOWORD(lParam);
		y = HIWORD(lParam);
		break;

	case WM_LBUTTONUP:
	case WM_RBUTTONUP:
		if (!bDraw)
			return FALSE;
		ReleaseCapture();
		bDraw = false;
		break;

	case WM_MOUSEMOVE:
		RECT rcClient;
		HDC hDC;
		HBITMAP hOldBmp;
		HBRUSH hTmpBrush, hOldBrush;
		hDC = GetDC(hWnd);
		GetClientRect (hWnd, &rcClient);
		if (!bDraw)
			break;
		x2 = (signed short)LOWORD(lParam);
		y2 = (signed short)HIWORD(lParam);

		hMemDC = CreateCompatibleDC(hDC);
		
		hOldBmp = (HBITMAP)SelectObject(hMemDC, hDrawingBitmap);

		MoveToEx(hMemDC, x, y, NULL);
		LineTo(hMemDC, x2, y2);

		x = x2;
		y = y2;
	
		ReleaseDC(hWnd, hdc);
		SelectObject(hMemDC, hOldBmp);
		DeleteDC(hMemDC);
		ReleaseDC(hWnd, hDC);
		InvalidateRect(hWnd, NULL, FALSE);

		break;

	case WM_PAINT:
		HDC hTmpDC;
		HBITMAP hTmpBmp;
		hdc = BeginPaint(hWnd, &ps);
		GetClientRect(hWnd, &rcClient);
		hTmpDC = CreateCompatibleDC(hdc);
		hTmpBmp = (HBITMAP)SelectObject(hTmpDC, hDrawingBitmap);
		BitBlt(	hdc,0,	0,ps.rcPaint.right ,ps.rcPaint.bottom,hTmpDC, 0,0,	SRCCOPY);
		//BitBlt(	hdc,0,	0,rcClient.right ,rcClient.bottom,hTmpDC, 0,0,	SRCCOPY);
		//BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,  ps.rcPaint.right - ps.rcPaint.left,  ps.rcPaint.bottom - ps.rcPaint.top,
		//	hTmpDC, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
		SelectObject(hTmpDC, hTmpBmp);
		DeleteDC(hTmpDC);
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Iosimo вне форума Ответить с цитированием
Старый 10.04.2012, 11:17   #17
Iosimo
Пользователь
 
Регистрация: 26.03.2012
Сообщений: 10
По умолчанию

Код:
BitBlt(	hdc,0,	0,ps.rcPaint.right ,ps.rcPaint.bottom,hTmpDC, 0,0,	        SRCCOPY);
		BitBlt(	hdc,0,	0,rcClient.right ,rcClient.bottom,hTmpDC, 0,0,	SRCCOPY);
		BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,  ps.rcPaint.right - ps.rcPaint.left,  ps.rcPaint.bottom - ps.rcPaint.top,
			hTmpDC, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
со всеми этими вариантами корректно выводит.

Так же на ткнулся на интересную книгу "Технология программирования на С win32 api_2010" издательство, кажется, "БХВ-Петербург" в ней представлены примеры работы с функцией BitBlt, если кто столкнется с теми же трудностями, что и я попробуйте ее найти.

Последний раз редактировалось Iosimo; 10.04.2012 в 13:45.
Iosimo вне форума Ответить с цитированием
Старый 10.04.2012, 14:54   #18
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Вижу не рабочий код.
Iosimo, честное слово, сами себе все усложняете.
Вот создали hDrawingBitmap, выбрали его в буферном hMemDC
SelectObject(hMemDC, hDrawingBitmap);
там и держите!
Зачем Вы каждый раз, при любом дрожании мышки, создаете контекст заново.
EUGY вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BitBlt прозрачное рисование Alex Cones Общие вопросы Delphi 2 29.06.2010 19:38
BitBlt, вывод изображения zotox Win Api 5 22.04.2010 21:43
BitBlt из памяти на экран Марин Win Api 6 25.01.2010 00:50
BitBlt ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 16.01.2010 19:04
BitBlt на контекст DC и его альтернатива notHaker Мультимедиа в Delphi 7 03.12.2009 01:04