在DELPHI中怎么才能把按钮边成自己想要的形状?请大家帮帮忙
将按钮的区域句柄得到,
再创建几个区域,与、或、非就行了
查查相关的api函数吧
//此函数通过一张位图来创建一个区域,支持bmp格式和jpg格式
//位图中黑色的地方将不透明,非黑色的地方透明,
//创建完毕后可以通过SetWindowRgn函数设置窗口或控件的形状,如:
//setWindowRgn(handle,zjs_createImageRegion(c:\goomoo.bmp),true);
uses jpeg;
function zjs_createImageRegion(imageFile:TFilename):HRGN;
var
bitmap:TBitmap; //位图对象
jpg:TJpegImage;
hRegion,hTmpRegion:HRGN; //hRegion: 最终区域 hTmpRegion 临时区域
h,l,left,right:integer; //h:行 l:列 left:临时区域的左边 right:临时区域的右边
started:Boolean; //是否开始记录
ext:String; //图片扩展名
begin
if not fileExists(imageFile) then
begin
result:=0;
exit; //文件不存在则退出,并返回0
end;
bitmap:=TBitmap.Create;
try
ext:=extractFileExt(imageFile); ext:=lowerCase(ext);
if (ext=.jpg) or (ext=.jpeg) then //如果是jpg图片
begin
jpg:=TJpegImage.Create;
try
jpg.LoadFromFile(imageFile);
bitmap.Assign(jpg); //从Jpg中把位图拷贝过来
finally
jpg.Free; //及时释放jpg
end;
end
else if ext=.bmp then
bitmap.LoadFromFile(imageFile) //载入位图
else
begin
result:=0;
exit;
end;
hRegion:=createRectRgn(0,0,0,0); //创建一个初始的空的区域
//初始化变量,消除警告信息
left:=0; right:=0;
//开始扫描图片的每个像素
for h:=0 to bitmap.Height-1 do
begin
started:=false;
for l:=0 to bitmap.Width-1 do
begin
if bitmap.Canvas.Pixels[l,h]=clBlack then //黑色为不透明区域,其他颜色为透明区域
begin
if not started then
begin
started:=true; //开始记录右边
left:=l; right:=l+1;
end
else //started
begin
right:=l;
end;
end
else
begin
if started then //如果已经开始并且该点的颜色不是黑色
begin
started:=false; //结束记录右边
hTmpRegion:=createRectRgn(left,h,right,h+1);
combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);
end;
end;
end;
if started then //到了图片的右边还没有结束
begin
if right>bitmap.Width-1 then right:=bitmap.Width-1;
hTmpRegion:=createRectRgn(left,h,right,h+1);
combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);
end;
end;
finally
bitmap.Free;
end;
Result:=hRegion;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
setWindowRgn(button1.Handle,zjs_createImageRegion(c:\goomoo.bmp),true);
end;