delphi怎么实现半透明不规则窗口呢? 我想实现下面的效果:类似vista侧边栏的搜索框。要求是圆角矩形窗体,宽度可变的,能输入搜索内容。我试了很多方法都不行,不知道大家能不能帮帮忙呢?谢谢大家~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CreateRgn其他你自己贴图 用文字做窗体形状,其他的都类似,自己找找资料就明白了procedure TForm1.FormCreate(Sender: TObject); var rgn:HRGN; begin Self.Color := clRed; BeginPath(Canvas.Handle); SetBkMode(Canvas.Handle,TRANSPARENT ); Canvas.Font.Name:='宋体'; Canvas.Font.Size:=100; Canvas.TextOut(20,20,'My Baby?'); EndPath(Canvas.Handle); rgn:= PathToRegion(Canvas.Handle); SetWindowRgn(Handle,rgn,true); end; 五角星窗体,摘自网络unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; const {An array of points for the star region} RgnPoints:array[1..10] of TPoint= ((x:203;y:22),(x:157;y:168),(x:3;y:168),(x:128;y:257), (x:81;y:402),(x:203;y:334),(x:325;y:422),(x:278;y:257), (x:402;y:168),(x:249;y:168));//确定顶点 LinePoints:array[1..11] of Tpoint= ((x:199;y:0),(x:154;y:146),(x:2;y:146),(x:127;y:235), (x:79;y:377),(x:198;y:308),(x:320;Y:396),(x:272;y:234), (x:396;y:146),(x:244;y:146),(x:199;Y:0));implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);var Rgn:HRGN;begin Setwindowpos(Form1.Handle,HWND_TOPMOST,Form1.Left,form1.Top,Form1.Width,Form1.Height,0); Rgn:=CreatepolygonRgn(Rgnpoints,High(RgnPoints),ALTERNATE); SetWindowRgn(Handle,rgn,True); Form1.color:=clgreen;end;end. 以下是用Api实现透明窗体的代码,最的一次第三个参数为透明的程度,范围为0~255,0为完全透明,255完全不透明.具体可参考MSDN SetWindowLong(self.Handle,GWL_EXSTYLE, GetWindowLong(Self.Handle,GWL_EXSTYLE) xor $80000); SetLayeredWindowAttributes(Self.Handle,0,100,LWA_ALPHA); CreateRgn 函数。或者你用透明的PNG做窗体来搞,半透明效果也可以实现,楼主可以联系我。 我用了 SetWindowLong(self.Handle,GWL_EXSTYLE, GetWindowLong(Self.Handle,GWL_EXSTYLE) xor $80000); SetLayeredWindowAttributes(Self.Handle,0,100,LWA_ALPHA);,透明效果出来了。可是我想把它嵌入桌面,但一加上ParentWindow:=FindWindow('Progman',Nil);透明效果就没了,是怎么回事呢? Windows.SetParent(Handle, FindWindow('Progman',Nil)); 这样试试 Form的BorderStyle设成bsnone, formstyle设成fsStayOnTop加一个圆角图unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, jpeg, ExtCtrls;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) Image1: TImage; 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);end;end. 效果图[image]http://beta.hi.csdn.net/attachment/200909/2/83329_1251865884RLrl.jpg[/image] 用GDI做吧。参考弄两张图片就搞定了 @liangqingzhi:我这样写的procedure TForm1.Edit1DblClick(Sender: TObject);begin Windows.SetParent(Handle, FindWindow('Progman',Nil));end;可是双击edit1控件后窗口就消失了。。 @mjp1234airen4385:用GDI不能用VCL吧。。 @dinoalex:谢谢您~但是我想实现嵌入桌面中应该怎么实现呢? GDI和VCL有关系吗?VCL可以独立运行,GDI是微软的一套图形接口,在VCL中引入GDI可以美化界面。你的界面,就是两张图就好了。最多输出文字和一条线。gdi方法。//装入背景图BPBack := TGPImage.Create(AppPath + 'Resources\bg.png');graph := TGPGraphics.Create(BPBack);//装入前景图BPTemp := TGPImage.Create(AppPath + 'Resources\detail.png'); graph.DrawImage(BPTemp, RectData, 0, 0, BPTemp.GetWidth, BPTemp.GetHeight, UnitPixel);//绘制数据graph.DrawString('搜索内容', -1, FontData, MakeRect(RectData.X, RectData.Y, RectData.Width, RectData.Height), StringFormat, brush);//绘制线条graph.DrawLine(TGPPen.Create(MakeColor(255, 255, 255, 255), 2), RectData.X, RectData.Y + 3, RectData.Width, RectData.Height); 三方空件 lMd控件 可以 l:=getWindowLong(Handle, GWL_EXSTYLE); l := l Or WS_EX_LAYERED; SetWindowLong (handle, GWL_EXSTYLE, l); SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);这样设置后,窗体可实现半透明,之后再用GDI+将你的PNG图片画到窗体上,这样就可以半透明了,但是控件也一起透明掉,所以可以考虑用窗体叠加的办法,即,用一窗体做背景,另一窗体上放置控件....., 当然另一个窗体上需要设置透明色,同时要处理鼠标之类的消息以达到两个窗体间的同步 看看这个桌面程序 www.ahjoe.com/prodesk.asp 实现方法有局限,在WindowsVista和Windows7下嵌入不了桌面 如何【获取】并【修改】EXE文件的【图标】和【版权信息】?? 在TDBGrid中设置DateSource属性时出错,请高手帮忙!!! ado连接字中“Persist Security Info=true”是什么意思? 关于使用键盘 在DBGRID中如何控制只让某一列可修改,其它列的不可修改? 为什么DeleteFile(FileName)不能删除size大的文件! 参数问题。。急。。。 我对Delphi论坛的一些建议,请Delphi版主,和Delphi的爱好者们进来看看 delphi在上海 帮忙!关于help文件的问题。 QuickRep1,如何设置其纸张大小? 郁闷贴.... 散分六
其他你自己贴图
var
rgn:HRGN;
begin
Self.Color := clRed;
BeginPath(Canvas.Handle);
SetBkMode(Canvas.Handle,TRANSPARENT );
Canvas.Font.Name:='宋体';
Canvas.Font.Size:=100;
Canvas.TextOut(20,20,'My Baby?');
EndPath(Canvas.Handle);
rgn:= PathToRegion(Canvas.Handle);
SetWindowRgn(Handle,rgn,true);
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1; const
{An array of points for the star region}
RgnPoints:array[1..10] of TPoint=
((x:203;y:22),(x:157;y:168),(x:3;y:168),(x:128;y:257),
(x:81;y:402),(x:203;y:334),(x:325;y:422),(x:278;y:257),
(x:402;y:168),(x:249;y:168));//确定顶点
LinePoints:array[1..11] of Tpoint=
((x:199;y:0),(x:154;y:146),(x:2;y:146),(x:127;y:235),
(x:79;y:377),(x:198;y:308),(x:320;Y:396),(x:272;y:234),
(x:396;y:146),(x:244;y:146),(x:199;Y:0));implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var Rgn:HRGN;
begin
Setwindowpos(Form1.Handle,HWND_TOPMOST,Form1.Left,form1.Top,Form1.Width,Form1.Height,0);
Rgn:=CreatepolygonRgn(Rgnpoints,High(RgnPoints),ALTERNATE);
SetWindowRgn(Handle,rgn,True);
Form1.color:=clgreen;
end;end.
GetWindowLong(Self.Handle,GWL_EXSTYLE) xor $80000);
SetLayeredWindowAttributes(Self.Handle,0,100,LWA_ALPHA);
GetWindowLong(Self.Handle,GWL_EXSTYLE) xor $80000);
SetLayeredWindowAttributes(Self.Handle,0,100,LWA_ALPHA);
,透明效果出来了。可是我想把它嵌入桌面,但一加上ParentWindow:=FindWindow('Progman',Nil);透明效果就没了,是怎么回事呢?
Form的BorderStyle设成bsnone, formstyle设成fsStayOnTop
加一个圆角图unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
jpeg, ExtCtrls;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)
Image1: TImage;
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);
end;end.
[image]
http://beta.hi.csdn.net/attachment/200909/2/83329_1251865884RLrl.jpg
[/image]
参考
弄两张图片就搞定了
begin
Windows.SetParent(Handle, FindWindow('Progman',Nil));
end;可是双击edit1控件后窗口就消失了。。
VCL可以独立运行,GDI是微软的一套图形接口,
在VCL中引入GDI可以美化界面。
你的界面,就是两张图就好了。
最多输出文字和一条线。
gdi方法。
//装入背景图
BPBack := TGPImage.Create(AppPath + 'Resources\bg.png');
graph := TGPGraphics.Create(BPBack);
//装入前景图
BPTemp := TGPImage.Create(AppPath + 'Resources\detail.png');
graph.DrawImage(BPTemp, RectData, 0, 0, BPTemp.GetWidth, BPTemp.GetHeight, UnitPixel);
//绘制数据
graph.DrawString('搜索内容', -1, FontData,
MakeRect(RectData.X, RectData.Y, RectData.Width, RectData.Height),
StringFormat, brush);
//绘制线条
graph.DrawLine(TGPPen.Create(MakeColor(255, 255, 255, 255), 2), RectData.X, RectData.Y + 3, RectData.Width, RectData.Height);
l := l Or WS_EX_LAYERED;
SetWindowLong (handle, GWL_EXSTYLE, l);
SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);
这样设置后,窗体可实现半透明,之后再用GDI+将你的PNG图片画到窗体上,这样就可以半透明了,但是控件也一起透明掉,所以可以考虑用窗体叠加的办法,即,用一窗体做背景,另一窗体上放置控件....., 当然另一个窗体上需要设置透明色,同时要处理鼠标之类的消息以达到两个窗体间的同步