Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.06.2009, 14:45
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию Прозрачность КОМПОНЕНТА

Всем привет. Набросал сегодня простенький компонент кнопки, но вот возникла проблема. Есть два этих самых компонентов, в первый загружается обычная картинка, а во второй картинка, на которой есть прозрачные области, которые закрашены clFuchsia. Если эти компоненты не персекаются, то все работает хорошо и области становятся прозрачными, но если пересекаются, то прозрачная область закрашивается белым (может быть и другой) цветом. Тоесть прозрачность не срабатывает. Как с этим бороться?
Ответить с цитированием
  #2  
Старый 27.06.2009, 04:14
Аватар для Mealgay
Mealgay Mealgay вне форума
Прохожий
 
Регистрация: 27.06.2009
Сообщения: 17
Репутация: 10
По умолчанию

// при создании формы придеться сделать подобное
Код:
var
  Main, Mask: TBitMap;
begin
  StackCtrls := TList.Create;

  BMain := TBitMap.Create;
  BMain.PixelFormat := pf32bit;
  BOutMain := TBitMap.Create;
  BOutMain.PixelFormat := pf32bit;

  Main := TBitMap.Create; Mask := TBitMap.Create;
  Main // просто фон ))
  Mask // грузим маску собственно все эффекты в самой маске, чем чернее тем прозрачней
  BuildCopy24to32(Main, Mask, BMain);
  BOutMain.Assign(BMain); 
  Main.Free; Mask.Free;

  SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE)
    or WS_EX_LAYERED); // позволим форме поддержку слоев
                          
  // форму под нашу картинку
  Width := BMain.Width; 
  Height := BMain.Height;     

  zsize.cx := BMain.Width;
  zsize.cy := BMain.Height;
  zpoint := Point(0,0);

  with zbf do
  begin
    BlendOp := AC_SRC_OVER;
    BlendFlags := 0;
    AlphaFormat := AC_SRC_ALPHA;
    SourceConstantAlpha := 255; // 255 - полная не прозрачность формы, сразу говорю что форма появлялась плавно это лучше не юзать, у меня лагает все
  end;

// на разрушение формы делаем подобное

PopAndDestroy(StackCtrls.Count);
StackCtrls.Free;
BOutMain.Free;
BMain.Free;

// ну собственно обновление

TopLeft := BoundsRect.TopLeft;
  UpdateLayeredWindow(Handle, 0, @TopLeft, @zsize, BOutMain.Canvas.Handle,
    @zpoint, 0, @zbf, ULW_ALPHA);
Admin: Пользуемся тегами!

// да и еще когда вызывается отрисовка сделайте чтот типа Painting: Boolean;

и вот когда например какой то контрол отрисовывается, а их очень много в очереди отрисовки, ставите Painting = true, и при вызове обновления слоя, проверка на то что Painting = false иначе выходим и таким образом ускорение отрисовки формы и исчезновение эффекта отрисовки формы

ну вот и все ))) кому интересно тут достаточно я выложил

Последний раз редактировалось Admin, 27.06.2009 в 11:05.
Ответить с цитированием
  #3  
Старый 30.06.2009, 10:29
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

Спасибо за ответ.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter