Как сделать прозрачную форму, сохраняя компонент видимым?

Мне нужно сделать программу, которая имеет одну форму, которая содержит изображение PNG с прозрачной областью. Форма должна быть невидимой, а изображение должно оставаться видимым, а прозрачная область должна оставаться прозрачной. Проблема заключается в прозрачности изображения. В этом случае основная форма прозрачна, невидима, а все компоненты/элементы управления остаются видимыми. Но прозрачная область изображения PNG не сохраняет прозрачность. Как сохранить прозрачность?

   procedure MakeTransparent;
   var
   AControl: TControl;
   A, Margin, X, Y, CtlX, CtlY: Integer;
   begin
     Margin    := (Width - ClientWidth) div 2;
     FullRgn   := CreateRectRgn(0, 0, Width, Height);
     X         := Margin;
     Y         := Height - ClientHeight - Margin;
   ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
   CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
   for A := 0 to ControlCount - 1 do
   begin
    AControl := Controls[A];
    if (AControl is TWinControl) or (AControl is TGraphicControl) then with        AControl do
   begin
    if Visible then
    begin
      CtlX   := X + Left;
      CtlY   := Y + Top;
      CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
      CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
    end;
  end;
  end;
  SetWindowRgn(Handle, FullRgn, True);
  end;



  procedure UndoTransparency;
  begin
   FullRgn := CreateRectRgn(0, 0, Width, Height);
   CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
   SetWindowRgn(Handle, FullRgn, True);
  end;

Ответ 1

Просто отпустите этот код с помощью кнопки в своей форме, и вы увидите, что ваша форма с вашим PNG становится прозрачной:

procedure SetTransparent(Aform: TForm; AValue: Boolean);
begin
  Aform.TransparentColor := AValue;
  Aform.TransparentColorValue := Aform.Color;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  SetTransparent(Self, True);
end;

Ответ 2

Если вам нужна частичная прозрачность, TransparentColor/TransparentColorValue не поможет.

Вам нужно будет использовать два совершенно разных метода для ситуаций NonAero (или DisabledAero) и EnabledAero.

Когда Aero включен, вам придется использовать такие методы: http://delphihaven.wordpress.com/category/glass/

Когда Aero отключен или не присутствует, вам придется использовать какой-то взлом:

  • Установить AlphaBlend: = True;
  • Сделайте снимок экрана рабочего стола wia BitBlt + GetDC + GetDesktopWindow. Ваше окно не будет на этом снимке экрана.
  • Нарисуйте свою фигуру на скриншоте, который имеет ту же позицию и размер, что и ваша форма. Фактически вы будете рисовать все, что находится за вашей формой, поэтому оно будет выглядеть прозрачно.
  • Периодически повторяйте действия 2 и 3.