procedure TPanel.WMPaint(var Msg: TMessage);
procedure AlphaBlendTabControl;
  var
    MemBitmap, OldBitmap: HBITMAP;
    BF: BLENDFUNCTION;
    MemDC, DC: HDC;
  begin
    if (Parent = nil) or not Parent.HandleAllocated then
      Exit;
    DC := GetDC(0);
    MemBitmap := CreateCompatibleBitmap(DC, Parent.Width, Parent.Height);
    ReleaseDC(0, DC);
    MemDC := CreateCompatibleDC(0);
    OldBitmap := SelectObject(MemDC, MemBitmap);
    try
      Parent.Perform(WM_ERASEBKGND, MemDC, MemDC);
      Parent.Perform(WM_PAINT, MemDC, 0);      BF.SourceConstantAlpha :=255;
      BF.AlphaFormat := 0;
      BF.BlendOp := AC_SRC_OVER;
      BF.BlendFlags := 0;
      Windows.AlphaBlend(Canvas.Handle, 0, 0, Width, Height, MemDC, Left,  Top, Width, Height, BF);
    finally
      SelectObject(MemDC, OldBitmap);
      DeleteDC(MemDC);
      DeleteObject(MemBitmap);
    end;
  end;
begin
  inherited;
  AlphaBlendTabControl;
end;
以上代码抄自 yumenyoudian 的一个回帖。
以下两句是什么意思不大明白,希望大家教下我!重画的是Panel还是form
      Parent.Perform(WM_ERASEBKGND, MemDC, MemDC);
      Parent.Perform(WM_PAINT, MemDC, 0);

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, jpeg, StdCtrls;type
      TPanel=class(ExtCtrls.TPanel)
      public
      procedure WMPaint(var Msg: TMessage); message WM_Paint;
      end;
      TForm1 = class(TForm)
        Panel1: TPanel;
        Image1: TImage;
        Button1: TButton;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TPanel }procedure TPanel.WMPaint(var Msg: TMessage);
    procedure AlphaBlendTabControl;
      var
        MemBitmap, OldBitmap: HBITMAP;
        BF: BLENDFUNCTION;
        MemDC, DC: HDC;
      begin
        if (Parent = nil) or not Parent.HandleAllocated then
          Exit;
        DC := GetDC(0);
        MemBitmap := CreateCompatibleBitmap(DC, Parent.Width, Parent.Height);
        ReleaseDC(0, DC);
        MemDC := CreateCompatibleDC(0);
        OldBitmap := SelectObject(MemDC, MemBitmap);
        try
          Parent.Perform(WM_ERASEBKGND, MemDC, MemDC);
          Parent.Perform(WM_PAINT, MemDC, 0);      BF.SourceConstantAlpha :=255;
          BF.AlphaFormat := 0;
          BF.BlendOp := AC_SRC_OVER;
          BF.BlendFlags := 0;
          Windows.AlphaBlend(Canvas.Handle, 0, 0, Width, Height, MemDC, Left,  Top, Width, Height, BF);
        finally
          SelectObject(MemDC, OldBitmap);
          DeleteDC(MemDC);
          DeleteObject(MemBitmap);
        end;
      end;
    begin
      inherited;
      AlphaBlendTabControl;
    end;
    end.
      

  2.   

    楼主,我在TPanel放一个image和button,为什么image也随着它一起不见
    而按钮却还在呢?
      

  3.   

    你把image放在窗体上,别放在pannel上啊。
    在image放张图片,调整BF.SourceConstantAlpha :=0~255;这个值就能看到效果了
      

  4.   

    这里的回答都是为了抢分吗?
          Parent.Perform(WM_ERASEBKGND, MemDC, MemDC); 
          Parent.Perform(WM_PAINT, MemDC, 0); 
    这里并不是要在parent上重画, 而是Parent将收到消息, 从而调用重画的过程,且对象场景是Memdc, 这里的memdc 是在上面申请得一个内存Dc, 可以在上面自由画画, 然后最后下面再调用一句话Windows.AlphaBlend(Canvas.Handle, 0, 0, Width, Height, MemDC, Left,  Top, Width, Height, BF);
    这句话会把内存Dc中的图像画到Panel的dc上, 这里也是绘图中经典的double buffer的的一个应用。 是不会出现那种闪烁的情况的, 这里你可以这么理解, panel是通知父容器告诉他, 请在我身上把我盖住你的部分再画出来把, 这里的panel可以想成肚皮, 父容器可以想成肚子, 肚皮通知肚子请他吧肚皮盖住的部分它画在肚皮上, 这里就产生了透明效果, 实际上那个不是真的透明 而是一个效果而已, 不知道这么说可以理解码
      

  5.   

    闪烁, 你把pannel。doublebuffer打开再试试
      

  6.   

    押宝全输了,来挣点分
    Hexpate说的很好