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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2013, 14:19   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Как рисовать на DC с использованием CreateDIBSection?

Всё-таки решил разобраться, как винда работает с графикой. Пытаюсь делать вот что:
Код:
case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		
		GetClientRect(h, &r);
#define MAX_WIDTH r.right-r.left
#define MAX_HEIGHT r.bottom-r.top

		BITMAPINFO bitmap;
		bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
		bitmap.bmiHeader.biWidth = MAX_WIDTH;
		bitmap.bmiHeader.biHeight = MAX_HEIGHT;
		bitmap.bmiHeader.biPlanes = 1;
		bitmap.bmiHeader.biBitCount = 32;
		bitmap.bmiHeader.biCompression = BI_RGB;
		bitmap.bmiHeader.biSizeImage = MAX_WIDTH * 4 * MAX_HEIGHT;
		bitmap.bmiHeader.biClrUsed = 0;
		bitmap.bmiHeader.biClrImportant = 0;

//Создаю DIBSection...
		hBitmap2 = CreateDIBSection(hdc, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
				
//Связываю DC с полученным hBitmap. 
		SelectObject(hdc, hBitmap2);
		
//Пытаюсь рисовать на связанном bitmap'е, но ничего не выходит
		for (int i=0; i<30000; i++)
			bitPointer[i] = 120;
		
		EndPaint(hWnd, &ps);
		break;
Update:
Пробовал сначала в память писать:
Код:
hdcTemp = CreateCompatibleDC(hdc);
		SelectObject(hdcTemp, hBitmap2);

		BitBlt(hdcTemp, 0, 0, MAX_WIDTH, MAX_HEIGHT, hdc, 0, 0, SRCCOPY);
		
		for (int i=0; i<30000; i++)
			bitPointer[i] = 120;
		
		BitBlt(hdc, 0, 0, MAX_WIDTH, MAX_HEIGHT, hdcTemp, 0, 0, SRCCOPY);

Последний раз редактировалось TwiX; 24.08.2013 в 14:37.
TwiX вне форума Ответить с цитированием
Старый 24.08.2013, 15:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
bitPointer[i] = 120;
А чего 120? там же цвет RGB нужно записывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.08.2013, 15:35   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Серый цвет)
Каждую компоненту нужно отдельно устанавливать. Пробовал все в 120 ставить
TwiX вне форума Ответить с цитированием
Старый 24.08.2013, 17:15   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Выбирать HBITMAP в HDC полученное от BeginPaint() смысла нет.
Всегда проверяйте что возвращают функции - возможно где-то что-то не прокатило ну у дальше уже рисовать не получается.
waleri вне форума Ответить с цитированием
Старый 25.08.2013, 01:55   #5
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

Даже представить боюсь, для чего нужно прямое редактирование пикселей, но вот:
Код:
			hdc = BeginPaint(hwnd, &ps);
			#define MAX_WIDTH r.right-r.left
			#define MAX_HEIGHT r.bottom-r.top
			GetClientRect(hwnd, &r);
			bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
			bitmap.bmiHeader.biWidth = MAX_WIDTH;
			bitmap.bmiHeader.biHeight = -MAX_HEIGHT;
			bitmap.bmiHeader.biPlanes = 1;
			bitmap.bmiHeader.biBitCount = 32;
			bitmap.bmiHeader.biCompression = BI_RGB;
			bitmap.bmiHeader.biSizeImage = MAX_WIDTH * 4 * MAX_HEIGHT;
			bitmap.bmiHeader.biClrUsed = 0;
			bitmap.bmiHeader.biClrImportant = 0;
			
			hdc2 = CreateCompatibleDC(hdc);
			hBitmap2 = CreateDIBSection(NULL, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
			SelectObject(hdc2, hBitmap2);
			
			for(int y=0; y<MAX_HEIGHT; y++)
				for(int x=0; x<MAX_WIDTH; x++)
			{
				bitPointer[y*MAX_WIDTH+x] = 0x00787878;//120 = 0x78
			}

			BitBlt(hdc,0,0,MAX_WIDTH,MAX_HEIGHT,hdc2,0,0,SRCCOPY);
			DeleteObject(hBitmap2);
			ReleaseDC(NULL,hdc2);
			EndPaint(hwnd, &ps);

Последний раз редактировалось asmprog; 25.08.2013 в 02:05.
asmprog вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CreateDIBSection Alex Cones Общие вопросы Delphi 3 17.07.2010 16:35
как рисовать символами в С++ Defa4ka Помощь студентам 6 02.05.2010 20:07
Таблицы - как рисовать nazavrik Общие вопросы C/C++ 13 23.11.2009 23:12
Как рисовать на Canvas объектов Jean-Esther Общие вопросы Delphi 2 02.03.2009 02:57