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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2009, 12:46   #1
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию Прозрачность - AlphaBlend

Итак, в продолжение своей идеи с "пузырями" здесь, необходимо разобраться с слоями и прозрачностью.

В ресурсах у меня есть битмап - окружность. Попытался сделать его прозрачным, но по всей видимости никак не пойму логики работы функции AlphaBlend, но прозрачнее картинка не становится.

Код:
	
        HDC hDC, hMemDC;
	static HBITMAP hBmpCirc;
	HINSTANCE hInst;
	static BITMAP bmpCirc;
	PAINTSTRUCT pnst;
	static int x=600, y=300;
	static RECT rec;
	static BLENDFUNCTION bfn;

case WM_CREATE:
		{	
			bfn.BlendOp = AC_SRC_OVER;
			bfn.BlendFlags = 0;
			bfn.SourceConstantAlpha = 10;
			bfn.AlphaFormat = AC_SRC_ALPHA;

			hDC = GetDC(hWnd);
			GetClientRect(hWnd, &rec);
		
			hMemDC = CreateCompatibleDC(hDC);
			hInst = (HINSTANCE)GetClassLong(hWnd, GCL_HMODULE);
			
			hBmpCirc = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));

			if(hBmpCirc == NULL)
			{
				MessageBox(NULL, "Error", "", MB_OK);
				break;
			}

			GetObject(hBmpCirc, sizeof(bmpCirc), (LPSTR)&bmpCirc);		

			ReleaseDC(hWnd, hDC);
			break;
		}

case WM_PAINT:
		{
			hDC = BeginPaint(hWnd, &pnst);

			hMemDC = CreateCompatibleDC(hDC);
			SelectObject(hMemDC, hBmpCirc);
			BitBlt(hDC, x, y, bmpCirc.bmWidth, bmpCirc.bmHeight, hMemDC, 0, 0, SRCCOPY);
			if(!AlphaBlend(hDC, x, y, bmpCirc.bmWidth, bmpCirc.bmHeight, hMemDC, 0, 0, bmpCirc.bmWidth, bmpCirc.bmHeight, bfn))
				MessageBox(NULL, "Error", "", MB_OK);
			DeleteDC(hMemDC);
			
			EndPaint(hWnd, &pnst);
			break;
		}
Что я делаю не так?
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 03.09.2009, 13:32   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Окно созданное с прозрачностью должно обладать стилями WS_EX_LAYERED - у вас оно таковым обладает? И сделать окно прозрачным можно гораздо проще - функцией SetLayeredWindowsAttributes.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 03.09.2009, 13:37   #3
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

У меня не окно прозрачное должно быть, а картинка IDB_BITMAP1, что в ресурсах.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 03.09.2009, 14:05   #4
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Все, нашел.

Косяк был в этом куске:

Код:
BitBlt(hDC, x, y, bmpCirc.bmWidth, bmpCirc.bmHeight, hMemDC, 0, 0, SRCCOPY);
			if(!AlphaBlend(hDC, x, y, bmpCirc.bmWidth, bmpCirc.bmHeight, hMemDC, 0, 0, bmpCirc.bmWidth, bmpCirc.bmHeight, bfn))
				MessageBox(NULL, "Error", "", MB_OK);
Если закомментить строчку BitBlt, то все будет работать.

И еще нужно было сбросить параметр bfn.AlphaFormat = 0; т.к. bfn.AlphaFormat = AC_SRC_ALPHA; если битмап имеет глубину цвета 32 бита.

Я правильно понимаю, что AlphaBlend и BitBlt делают одно и то же: передают битмап с совместимого контекста устройства в памяти реальному контексту устройству (дисплею)? С той лишь разницей, что AlphaBlend еще определяет прозрачность.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 03.09.2009, 15:44   #5
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
Окно созданное с прозрачностью должно обладать стилями WS_EX_LAYERED - у вас оно таковым обладает? И сделать окно прозрачным можно гораздо проще - функцией SetLayeredWindowsAttributes.
решил поэкспериментировать с окном и попробовать функцию SetLayeredWindowsAttributes, но когда прописываю в стилях окна WS_EX_LAYERED, мне выдает ошибку: undeclared identifier.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 04.09.2009, 02:20   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Код:
BitBlt(hDC, x, y, bmpCirc.bmWidth, bmpCirc.bmHeight, hMemDC, 0, 0, SRCCOPY);
			if(!AlphaBlend(hDC, x, y, bmpCirc.bmWidth, bmpCirc.bmHeight, hMemDC, 0, 0, bmpCirc.bmWidth, bmpCirc.bmHeight, bfn))
				MessageBox(NULL, "Error", "", MB_OK);
Не совсем понял, что Вы тут делаете...
Вы сначала выводите картинку без прозрачности, а потом поверх неё рисуете её же, но уже с прозрачностью... %)

Я бы от того кода попробовал оставить только это:
Код:
AlphaBlend(hDC, x, y, bmpCirc.bmWidth, bmpCirc.bmHeight, hMemDC, 0, 0, bmpCirc.bmWidth, bmpCirc.bmHeight, bfn)

P.S.

Вот > тут < описание функции...

И полезная цитата:
Цитата:
Sapersky (09.08.09 18:04) [55]

Обычная формула блендинга:
DstColor = SrcColor * SrcAlpha + DstColor * (1 - SrcAlpha)
Есть во 2-м примере, там сначала блюр, потом блендинг.
AlphaBlend использует такую:
DstColor = SrcColor + DstColor * (1 - SrcAlpha)
(что, кстати, расписано по ссылке http://msdn.microsoft.com/en-us/libr...,printer).aspx , которая приводилась ещё в [22])
С т.з. быстродействия должно быть немного лучше, т.к. экономится одно умножение. Но практически, насколько помню, полная формула через MMX всё равно быстрее.
Соответственно PremultAlpha выполняет операцию:
SrcColor = SrcColor * SrcAlpha
Ну и на практике к формулам добавляется сдвиг вправо (shr 8, 16) - эквивалент div 256, 65536 - чтобы привести результат к диапазону 0..255.
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прозрачность SanekIrk Общие вопросы Delphi 4 30.12.2008 12:12
прозрачность Артэс Win Api 8 02.12.2008 11:24
AlphaBlend - прозрачность картинки Vovandows Мультимедиа в Delphi 2 26.09.2008 00:35
AlphaBlend + ShowModal Cardagant Общие вопросы Delphi 2 11.06.2008 15:42
Прозрачность Лубышев Помощь студентам 3 23.01.2008 00:05