-
Нужно в свой компонент, который унаследован от TCustomPanel, добавить свойство прозрачости + настройка прозрачности - типа как в TForm - AlphaBlend и AlphaBlendValue
-
> Нужно в свой компонент, который унаследован от TCustomPanel, > добавить свойство прозрачости + настройка прозрачности > - типа как в TForm - AlphaBlend и AlphaBlendValue
Это полу-прозрачность, если что. WINDOWS.SetWindowLong(W, GWL_EXSTYLE, GetWindowLong(W, GWL_EXSTYLE) or WS_EX_LAYERED);
WINDOWS.SetLayeredWindowAttributes(W, 0, 255, LWA_ALPHA); Зы не совсем уверен что работает с НЕ WS_OVERLAPPED окнами.
-
-
> homm © (21.03.07 02:04) [1] > > Нужно в свой компонент, который унаследован от TCustomPanel, > > > добавить свойство прозрачости + настройка прозрачности > > > - типа как в TForm - AlphaBlend и AlphaBlendValue > > Это полу-прозрачность, если что. > > WINDOWS.SetWindowLong(W, GWL_EXSTYLE, GetWindowLong(W, GWL_EXSTYLE) > or WS_EX_LAYERED); > WINDOWS.SetLayeredWindowAttributes(W, 0, 255, LWA_ALPHA); > > > Зы не совсем уверен что работает с НЕ WS_OVERLAPPED окнами. >
C TCustomPanel не работает
-
Note that WS_EX_LAYERED cannot be used for child windows
-
Плавное изменение прозрачности делать не нужно Смысл в том, чтобы сама панель была прозрачной, т.е. в виде прямоугольной "вырезки" на форме... Использую следующий метод Paint:
procedure TPanelka.Paint;
const
Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
var
Rect: TRect;
TopColor, BottomColor: TColor;
FontHeight: Integer;
Flags: Longint;
procedure AdjustColors(Bevel: TPanelBevel);
begin
TopColor:=FTopColor;
BottomColor:=FBottomColor;
end;
begin
Rect := GetClientRect;
if BevelOuter <> bvNone then
begin
AdjustColors(BevelOuter);
Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
end;
Frame3D(Canvas, Rect, Color, Color, BorderWidth);
if BevelInner <> bvNone then
begin
AdjustColors(BevelInner);
Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
end;
if FPicture.Graphic<>nil then
begin
self.Canvas.FillRect(Rect);
self.Canvas.StretchDraw(rect,FPicture.Graphic);
with Canvas do
begin
FillRect(Rect);
Font := Self.Font;
FontHeight := TextHeight('W');
case AlignmentV of
InCenter:
with Rect do
begin
Top:=((Bottom+Top)-FontHeight) div 2;
Bottom:=Top+FontHeight;
end;
InBottom:
Rect.Top:=Rect.Bottom-FontHeight-1;
end;
Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[FAlignment];
Flags := DrawTextBiDiModeFlags(Flags);
DrawText(Handle, PChar(Caption), -1, Rect, Flags);
end;
end else
begin
with Canvas do
begin
if self.TranspEnable=True then
begin
if not (csDesigning in ComponentState) then
begin
Тут остаётся предыдущий Brush.Color, его надо убрать (обесцветить). Но как?
FillRect(Rect);
Brush.Style:=bsClear;
Font:=self.Font;
FontHeight:=TextHeight('W');
end
end else
begin
Brush.Color := Color;
FillRect(Rect);
Brush.Style := bsClear;
Font := Self.Font;
FontHeight := TextHeight('W');
end;
case AlignmentV of
InCenter:
with Rect do
begin
Top:=((Bottom+Top)-FontHeight) div 2;
Bottom:=Top+FontHeight;
end;
InBottom:
Rect.Top:=Rect.Bottom-FontHeight-1;
end;
Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[FAlignment];
Flags := DrawTextBiDiModeFlags(Flags);
DrawText(Handle, PChar(Caption), -1, Rect, Flags);
end;
end;
self.Update;
end;
-
> Смысл в том, чтобы сама панель была прозрачной
Толь я слепой, толи лыжи не едут - незаметил ничего по этому поводу. Где ваша прозрачность ?
-
WinControl может быть прозрачным только если это форма. Во всех остальных случаях - это только иммитация прозрачности: попытка скопировать изображение под контролом на свою канву.
-
А технологию прозрачности формы нельзя внедрить в панельку?
-
Читайте пост [2],[4].
-
Вот из всей ветки непонятно, ЧТО же нужно автору в [0], что нужно вопрошающему [8]. Прозрачность или полу-прозраность? Это разные веши! Не смотря на то что первая является частным случаем для второй — пути решения могут быть РАЗНЫЕ, по крайней мере для не child окон. Для child скорее всего придется самому прорисовывать родителя под нужным контролом в буферную картинку, и на ней рисовать свой контролл.
-
Хочешь прозрачную панель - не рисуй ее :?)))))
-
> homm © (11.04.07 09:51) [10] > Для child скорее всего придется > самому прорисовывать родителя под нужным контролом в буферную > картинку, и на ней рисовать свой контролл.
Задать регион, огибающий все контролы :) Только я вот не в курсе может ли регион окна состоять из несвязанных кусков. Вроде может.
|