1.在Delphi中,设置窗体的AlphaBlend := true;AlphaBlendValue := 0-255; AlphaBlendValue越小窗体的透明度就越高。这种方法将会使窗体和窗体中控件都变成透明。
2.在Delphi中,设置TransparentColor := True与TransparentColorValue := TForm.Color, 则窗体变成透明,控件不透明。
3.使用API控制指定区域透明,如下,通过不绘制窗体四角的方法,来使四角变得圆滑透明,可在窗体Resize时调用。
procedure TFormPadMain.SetFormTransparent;
var
Rgn: HRGN;
begin
Rgn := CreateRoundRectRgn(0, 0, Width, Height, 11, 11);
SetWindowRgn(Handle, Rgn, True);
end;
-----------------------------------------------------------------------------------------------------------
DELPHI实现透明以及半透明窗体
上一篇《在DELPHI中获得磁盘容量》
下一篇《在DELPHI中编程生成ACCESS数据库文件并创建指向此连接的ODBC数据源》
在QQ中,我可以调节面板的透明度。如果我们自己编程,应该如何实现呢?
(一)半透明窗体
在windows2000以及后续产品中下增加了一些API,可以轻易的实现半透明的窗体,源程序如下:
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
const//定义常量
WS_EX_LAYERED = $80000;
AC_SRC_OVER = $0;
AC_SRC_ALPHA = $1;
AC_SRC_NO_PREMULT_ALPHA = $1;
AC_SRC_NO_ALPHA = $2;
AC_DST_NO_PREMULT_ALPHA = $10;
AC_DST_NO_ALPHA = $20;
LWA_COLORKEY = $1;
LWA_ALPHA = $2;
ULW_COLORKEY = $1
ULW_ALPHA = $2
ULW_OPAQUE = $4
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint; bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;//函数声明
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var l:longint;
begin
l:=getWindowLong(Handle, GWL_EXSTYLE);
l := l Or WS_EX_LAYERED;
SetWindowLong (handle, GWL_EXSTYLE, l);
SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);
//第二个参数是指定透明颜色
//第二个参数为0则使用第四个参数设置alpha值,从0到255
end;
end.
(二) 透明窗体的实现
将一个FORM变成透明的实质性手段就是拦截CMEraseBkgnd消息。
unit Utransform; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm)
private { Private declarations }
public { Public declarations }
PROCEDURE CMEraseBkgnd(var Message:TWMEraseBkgnd);Message WM_ERASEBKGND;
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.CMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
brush.style:=bsClear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Brush.Style := bsClear;//如果只拦截消息,没有这里的设置,窗内的标题栏一样会显示 Form1.BorderStyle := bsNone
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
close;
end;(王朝网络 wangchao.net.cn)