|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Прозрачность КОМПОНЕНТА
Всем привет. Набросал сегодня простенький компонент кнопки, но вот возникла проблема. Есть два этих самых компонентов, в первый загружается обычная картинка, а во второй картинка, на которой есть прозрачные области, которые закрашены clFuchsia. Если эти компоненты не персекаются, то все работает хорошо и области становятся прозрачными, но если пересекаются, то прозрачная область закрашивается белым (может быть и другой) цветом. Тоесть прозрачность не срабатывает. Как с этим бороться?
|
#2
|
||||
|
||||
// при создании формы придеться сделать подобное
Код:
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); // да и еще когда вызывается отрисовка сделайте чтот типа Painting: Boolean; и вот когда например какой то контрол отрисовывается, а их очень много в очереди отрисовки, ставите Painting = true, и при вызове обновления слоя, проверка на то что Painting = false иначе выходим и таким образом ускорение отрисовки формы и исчезновение эффекта отрисовки формы ну вот и все ))) кому интересно тут достаточно я выложил Последний раз редактировалось Admin, 27.06.2009 в 11:05. |
#3
|
|||
|
|||
Спасибо за ответ.
|