Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.74.227] |
|
Сообщ.
#1
,
|
|
|
Добрый день, гуру!
Пытаюсь создать компонент, который будет отрисовывать на собственной канве полупрозрачный png. При этом, он не должен затирать то, что под ним (например, Label). В качестве родительского выбран класс TCustomControl. И вот беда - он под собой заливает(?) канву цветом формы... Как можно добиться того, чтобы потомок TCustomControl не затирал то, что под ним отрисовано? Я пробовал и ControlStyle := ControlStyle - [csOpaque]; и procedure TMyControl.Paint; begin Canvas.Brush.Style := bsClear; inherited; ... end; и procedure TMyControl.Paint; begin SetBkMode(Canvas.Handle, TRANSPARENT); ... end; Не помогло... Не подскажите ли, как быть? Куда смотреть? Спасибо! |
Сообщ.
#2
,
|
|
|
TWinControl не может быть прозрачным или полупрозрачным, если это не форма. Любые прозрачные WIN-контролы это имитация прозрачности, попытка нарисовать изображение под собой на своей канве.
Note that WS_EX_LAYERED cannot be used for child windows |
Сообщ.
#3
,
|
|
|
DimaBr, спасибо за ответ! направление понятно )
И в итоге у меня получилось следующее: procedure TGSCustomImageControl.WMEraseBkGnd(var msg: TWMEraseBkGnd); begin msg.result := 1; end Так фон не стирается перед отрисовкой в Paint. И после этого можно AlphaBlend'ом отрисовать контрол полупрозрачно на имеющемся фоне. Но появляется другая проблема - каждая отрисовка накладывает на отрисованную ранее полупрозрачную картинку еще одну такую же, и получается что полупрозрачность выведенной картинки с каждой отрисовкой уменьшается... Вот, теперь, как бы умудриться получать изображение того, что должно быть отрисовано под моим контролом? Пробую сделать вот так: ... FParentBMP: TBitMap; ... procedure TGSCustomImageControl.WMEraseBkGnd(var msg: TWMEraseBkGnd); begin BitBlt(FParentBMP.Canvas.Handle, 0, 0, Width, Height, GetDC(Parent.Handle), Left, Top, SRCCOPY); msg.result := 1; end; procedure TGSCustomImageControl.Paint; begin BitBlt(Canvas.Handle, 0, 0, Width, Height, FParentBMP.Canvas.Handle, 0, 0, SRCCOPY); // далее подготовка картинки и blendFunction ... // отрисовка Windows.AlphaBlend(Canvas.Handle, 0,0,FMasterBMP.Width, FMasterBMP.Height, FMasterBMP.Canvas.Handle, 0,0,FMasterBMP.Width,FMasterBMP.Height, bf); end; Но это не дает результата... Можете подсказать, как быть в этот раз? |
Сообщ.
#4
,
|
|
|
Да, забыл еще указать вот это в моем варианте:
procedure TGSCustomImageControl.CreateParams(var Params: TCreateParams); begin inherited; Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT; end; |
Сообщ.
#5
,
|
|
|
Нормальная прозрачность всё равно не получится, даже в продвинутых либах наблюдаются неприятные глюки
|
Сообщ.
#6
,
|
|
|
Цитата DimaBr @ Нормальная прозрачность всё равно не получится, даже в продвинутых либах наблюдаются неприятные глюки А если контрол еще и интерактивный (имеет возможность ввода, или просто имеет скроллбары) - так это вообще гиблое дело. |