Конференция "Компоненты" » Подскажите - как сделать прозрачную TCustomPanel? [D6, D7, WinXP]
 
  • SkySpeed (20.03.07 21:12) [0]
    Нужно в свой компонент, который унаследован от TCustomPanel, добавить свойство прозрачости + настройка прозрачности - типа как в TForm - AlphaBlend и AlphaBlendValue
  • 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 окнами.
  • DimaBr (21.03.07 09:47) [2]
  • SkySpeed (24.03.07 15:54) [3]

    > 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 не работает
  • DimaBr (26.03.07 09:54) [4]
    Note that WS_EX_LAYERED cannot be used for child windows
  • SkySpeed (08.04.07 12:49) [5]
    Плавное изменение прозрачности делать не нужно
    Смысл в том, чтобы сама панель была прозрачной, т.е. в виде прямоугольной "вырезки" на форме...

    Использую следующий метод 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;

  • DimaBr (10.04.07 13:43) [6]

    > Смысл в том, чтобы сама панель была прозрачной

    Толь я слепой, толи лыжи не едут - незаметил ничего по этому поводу. Где ваша прозрачность ?
  • DimaBr (10.04.07 16:59) [7]
    WinControl может быть прозрачным только если это форма. Во всех остальных случаях - это только иммитация прозрачности: попытка скопировать изображение под контролом на свою канву.
  • roughneck (11.04.07 07:17) [8]
    А технологию прозрачности формы нельзя внедрить в панельку?
  • DimaBr (11.04.07 08:54) [9]
    Читайте пост [2],[4].
  • homm © (11.04.07 09:51) [10]
    Вот из всей ветки непонятно, ЧТО же нужно автору в [0], что нужно вопрошающему [8]. Прозрачность или полу-прозраность? Это разные веши! Не смотря на то что первая является частным случаем для второй — пути решения могут быть РАЗНЫЕ, по крайней мере для не child окон. Для child скорее всего придется самому прорисовывать родителя под нужным контролом в буферную картинку, и на ней рисовать свой контролл.
  • roughneck (19.04.07 07:51) [11]
    Хочешь прозрачную панель - не рисуй ее :?)))))
  • KSergey © (27.11.07 17:27) [12]
    > homm ©   (11.04.07 09:51) [10]
    > Для child скорее всего придется
    > самому прорисовывать родителя под нужным контролом в буферную
    > картинку, и на ней рисовать свой контролл.

    Задать регион, огибающий все контролы :)
    Только я вот не в курсе может ли регион окна состоять из несвязанных кусков. Вроде может.
 
Конференция "Компоненты" » Подскажите - как сделать прозрачную TCustomPanel? [D6, D7, WinXP]
Есть новые Нет новых   [119194   +120][b:0][p:0.002]