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);
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);
解决方案 »
- delphi修改内存汇编的写法问题
- 清明节--我思念父亲
- 请问哪位有CMPP3.0协议?或者提供一下下载链接?
- 望能指点一二:仍旧是dbgrid的打印结果问题 我才开始学习delphi7
- 高分请教本机新建web站点,不能启动
- 问一个toolbar的问题
- 关于adoquery的问题,很急!!!!
- 可能是一个很菜的问题:一旦在ID中加上了自己的组件面板和组件,怎么把它们去掉?
- *.img是什么文件?用是么软件可以打开?
- 在SQL SERVER中为什么执行“Select * From TableName Where Field1=''”语句不会有结果?
- 谁有ImageEN的事例?给小弟个看看学学
- 庆祝澳门回归十周年,周一结帖!
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.
而按钮却还在呢?
在image放张图片,调整BF.SourceConstantAlpha :=0~255;这个值就能看到效果了
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可以想成肚皮, 父容器可以想成肚子, 肚皮通知肚子请他吧肚皮盖住的部分它画在肚皮上, 这里就产生了透明效果, 实际上那个不是真的透明 而是一个效果而已, 不知道这么说可以理解码
Hexpate说的很好