Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблемы с прозрачностью AlphaBlend

41K
01 сентября 2008 года
drxa0z
3 / / 01.09.2008
возникла такая проблема - программа выводит информацию поверх всех окон с заданным уровнем прозрачности - все работает, но есть одна проблема - текст любого цвета не видно на белом фоне.

подскажите - как побороть?
или может какой то другой метод вывода прозрачного текста поверх всех окон?


вот код:

Код:
with image2 do
  begin
  //выводим текст во временный  TImage c черным фоном
      Width :=screen.Width;
      Height := screen.Height;
      top:= 0;
      Left:=0;
// заполняем фон черным
      canvas.CopyMode := cmBlackness;
      Canvas.Copyrect(Rect(0,0,Image2.Width,Image1.Height),  tdc, Rect(0,0,Screen.Width,Screen.Height));
// убираем фон текста, устанавливаем шрифт цвет и выводим
      canvas.Brush.Style := bsClear;
      canvas.Font.Handle:=TempFont;
      canvas.Font.Color:= RGB(red,green,blue);
      Canvas.TextOut(tx, ty, str);
  end;
//настройки прозрачности
  Blend.BlendOp := AC_SRC_OVER;
  Blend.BlendFlags := 1;
  Blend.SourceConstantAlpha := 128; // прозрачность 50% (0 - 255)
  Blend.AlphaFormat := AC_SRC_ALPHA;
    //выводим текст на экран
  windows.AlphaBlend(dtc.Handle,0,0,screen.Width,screen.Height,image2.Canvas.Handle,0,0,screen.Width,screen.Height,blend);

  //ждем-с
 sleep(slp);
// ..обновляем
InvalidateRect(0, nil, true);
1.9K
02 сентября 2008 года
andriano
474 / / 10.01.2008
Чем ты пользуешься, не знаю, поэтому не знаю и особенностей применения констант.
Но, судя по результату, ты делаешь не "прозрачность", а "сложение".
Т.е. прозрачность должна быть:
Y := Alpha*Src + (1-Alpha)*Dst;
а у тебя:
Y := Alpha*Src + Dst;
Подозреваю, что
AC_SRC_OVER
надо заменить на что-то другое.
41K
02 сентября 2008 года
drxa0z
3 / / 01.09.2008
"Поле BlendOp может принимать единственное значение AC_SRC_OVER"
http://articles.org.ru/cn/showdetail.php?cid=6584
там же и описание этой функции AlphaBlend()
ладно... буду дальше ковырятся
14
02 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
Непонятно, что за image1, что за tdc и что за dtc..
1.9K
04 сентября 2008 года
andriano
474 / / 10.01.2008
Цитата: drxa0z
"Поле BlendOp может принимать единственное значение AC_SRC_OVER"
http://articles.org.ru/cn/showdetail.php?cid=6584
там же и описание этой функции AlphaBlend()
ладно... буду дальше ковырятся



В таком случае это - проблемы выбранного инструмента.
Сами по себе API поддерживают гораздо больший список поддерживаемых режимов смешивания.
Погльзуйся оригинальными библиотеками, а не оболочками для них.

PS. Прошу прощения, сразу не заглянул по ссылке. Думаю, для корректного смешивания стоит пользоваться не GUI-шным WinAPI, а DirectX или OpenGL. При наличии специализированнызх инструментов общие вряд ли будут вылизываться и доводиться до ума. Т.е. собственно, совет прежний - пользоваться адекватным задаче API.

87
04 сентября 2008 года
Kogrom
2.7K / / 02.02.2008
Попробуйте
 
Код:
//настройки прозрачности
  Blend.BlendOp := AC_SRC_OVER;
  Blend.BlendFlags := 0;
  Blend.SourceConstantAlpha := 128; // прозрачность 50% (0 - 255)
  Blend.AlphaFormat := 0;
41K
05 сентября 2008 года
drxa0z
3 / / 01.09.2008
пробовал.. не то...
вообщем пошел изучать опенЖЛ
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог