11

透明な領域を持つ PNG 画像を含む 1 つのフォームを持つプログラムを作成する必要があります。フォームは非表示にする必要がありますが、画像は表示したままにし、透明な領域は透明のままにする必要があります。問題は画像の透過性です。この場合、メイン フォームは透明で非表示ですが、すべてのコンポーネント/コントロールは表示されたままです。ただし、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;
4

2 に答える 2

10

このコードをフォームのボタンにドロップするだけで、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;
于 2012-04-11T02:20:27.287 に答える
4

部分的な透明度が必要な場合は、TransparentColor/TransparentColorValueは役に立ちません。

NonAero(またはDisabledAero)とEnabledAeroの状況では、2つのまったく異なる方法を使用する必要があります。

Aeroが有効になっている場合は、次のような方法を使用する必要があります:http: //delphihaven.wordpress.com/category/glass/

Aeroが無効になっているか存在しない場合は、何らかのハックを使用する必要があります。

  1. AlphaBlendを設定します:= True;
  2. BitBlt + GetDC+GetDesktopWindowを使用してデスクトップのスクリーンショットを作成します。ウィンドウはそのスクリーンショットには表示されません。
  3. フォームと同じ位置とサイズのスクリーンショットのフォーム部分に描画します。実際、フォームの背後にあるものは何でも描画することになります。そのため、フォームは透明に見えます。
  4. アクション2と3を定期的に繰り返します。
于 2012-04-11T08:46:54.553 に答える