弄个三角形的图片,然后根据这个图片用RGN做个异型的panel出来其他的和panel一样操作了下面是我自己写的一个,凑合能用function MakeRegion(bmp:TBitmap;TransparentColor:TColor; var RealRect:TRect):HRGN;var lineregion, {当前纪录区域} fullregion:hrgn; {整体区域} x,y, {当前像素位置坐标} startlinex:integer; {纪录区域的起始点} infirstregion, {是否第一次添加区域} inlinea:boolean; {是否可以添加区域 - 区别连续透明点} hdc:hwnd;{图象框的句柄} cl,tx:tcolor;begin bmp.PixelFormat:=pf24bit; hdc:=bmp.canvas.handle;//得到图象框的句柄 infirstregion:=true; inlinea:=false; RealRect:=rect(0,0,0,0); startlinex:=0; fullregion:=0; transparentcolor:=getpixel(hdc,0,0);//指定透明色 for y:=0 to bmp.height-1 do begin for x:=0 to bmp.width-1 do begin cl:=getpixel(hdc,x,y); if (cl=TransparentColor) or (x=bmp.width-1) then begin {如果遇到透明点或者一行结束,则把当前纪录区域添加到总区域中} if inlinea then {如果可以添加区域} begin lineregion:=createrectrgn(startlinex,y,x,y+1); {获取当前区域} if infirstregion then {是否第一次添加区域} begin fullregion:=lineregion; infirstregion:=false; end else begin combinergn(fullregion,fullregion,lineregion,rgn_or); deleteobject(lineregion); end; inlinea:=false; {添加区域结束,未重新纪录,不可以添加区域} end; end else if not inlinea then begin {如果是可以纪录的点,并且不可以添加区域状态,则纪录该点,设置可以添加区域} if cl=clwhite then tx:=cl; inlinea:=true; startlinex:=x; end; end; end; GetRgnBox(fullregion,RealRect); result:= fullregion; //返回所形成的不规则区域end;//-----------调用------------------var FHRgn: HRGN;...var rc:trect;begin with panel do begin FHRgn:=MakeRegion(FBitmap,FTransparentColor,rc); BoundsRect:=rect(left,top,rc.Right+left,rc.Bottom+top); SetWindowRgn(Handle, FHRgn, True); end;end;... DeleteObject(FHRgn);