图片圆角是如何实现?请教高手!
像360样的界面 他的界面四个角都是圆角 这个要怎么实现?换句话说 Image如何实现圆角!
[解决办法]
制作不规程窗口
你是不是已经被windows中方方正正的窗口搞得反胃过!也许你也看见过在其他程序中出现的不规则窗口,并且被搞得兴奋不已。如果你认为这是一种复杂且难以掌握的技术的话,那可就大错特错了!改变窗口的形状可能是最简单的编程技术之一,下面我用Delphi来举个例子。
启动Delphi后,你会看到一个看到一个默认的名为form1的窗口,显然这是个标准的Windows窗口--因为它是彻底的方方正正!双击这个窗口,你将会进入程序编写的部分。翻页向上览阅,你会看到有一行粗黑体的“USES”,确保其后紧跟"windows"这个词,这表示你可以使用大部分的windowsAPI而不用弄破头。然后在翻页往下,一直到出现“procedure TForm1.FormCreate(Sender: TObject);”,如果你事先将窗口的名字改了,那么我可不敢保证出现的是这么一句话。再下面是“Begin”和“End;”,在“Begin”和“End”之间插入光标,按回车,空开一行以便我们输入语句。
写下“SetWindowRgn(form1.Handle,CreateEllipticRgn(0, 0, 300, 100),true);”,注意最后一定要加分号!这是为了不至于出现一大堆的警告和错误。按下运行键或是选取菜单“ RUN::RUN”稍侯片刻,在屏幕中出现一个椭圆的窗口!
现在,我来解释一下:首先“SetWindowRgn”表示我们要通知Windows要改变窗口的形状,然后在扩号内的是一大串参数。第一个参数是告诉Windows是对哪个窗口进行操作,Delphi中的handle属性与VB中的hWND属性一致(详细请参看《制作3D屏幕保护程序》一文);第二个参数是一个函数,告诉windows我们要的椭圆的大小起始点在0,0处,然后长300,高200。最后的“true”告诉windows立刻执行。
显然,你也可以改变CreateEllipticRgn的参数来获得不同的椭圆,由于起始点的改变可能使标题栏不会出现以至于无法移动窗口或最小化等问题,但是你可以在程序中作出处理(这里将不涉及这方面的讨论,任何一本Delphi书都可能包含这些内容)。
同时,将CreateEllipticRgn替换成以下函数可以获得不同的窗口形状:
1. 矩形 CreateRectRgn(X1:long,Y1:long,X2:long,Y2:long)
2. 圆角矩形 CreateRoundRectRgn ( X1:Long, Y1:Long, X2:Long, Y2:Long, X3:Long,Y3:Long)
3. 多边形 CreatePolygonRgn (lpPoint:POINTAPI,nCount:Long,nPolyFillMode:Long)
4. 由多边形围成的区域 CreatePolyPolygonRgn (lpPoint:POINTAPI,lpPolyCounts :Long,nCount:Long,nPolyFillMode:Long)
显然,最后两个函数可以将窗口变成五花八门的形状!你可以参考相关的资料来学习如何使用它们(由于调用最后两个函数可以涉及很多相关函数和内容,所以在这里不做讨论)。另外只要稍作改变,这个技巧就可以在其它编程工具中使用,在这里我们使用的是经过Delphi封装的WindowsAPI函数,因此在其他工具中可能要显式的声明或调用其封装的函数,(SetWindowRgn在user32.dll,其它函数均包含在gdi32.dll中)。
[解决办法]
建议不要用一张大图贴到Form上,可以把图片拆分贴到对应位置上。创建圆角窗口如下:
procedure TWnd.CreateRoundWnd();
var
hr :thandle;
begin
hr := CreateRoundRectRGN(0,0,Width+1,Height+1,9,9);
SetWindowRgn(Handle,hr,true);
end;
procedure TWnd.FormCreate(Sender: TObject);
begin
lblTitle.Caption := Caption;
Color := StrToIntDef(sysObj.SkinColor,clBtnFace);
CreateRoundWnd();
LoadWindowFrame(); //加载相关的图片资源
lblTitle.OnMouseDown := ReadyToMove;
imgTitleBanner.OnMouseDown := ReadyToMove;
imgClose.OnClick := OnCloseForm;
end;