在delphi的timage组建中有一个transparent属性,如果把次属性设置为true,
就能实现图象的透明了。
透明图象
代码:
声明变量:
private
{priavate declarations}
foreimage,backimage:timage;
procedure drawtransparentbitmap(dc:hdc;image:timage;xstart,ystart:word);
编辑:
procedure tform1.drawtransparentbitmap(dc:hdc;image:timage;xstart,
ystart,ystart:word);
var
transparentcolor:tcolor;
//透明背景颜色
ccolor:tcolorref;
bmandback,bmandobject,bmandmem,bmsave,bmbackold,bmobjectold,
bmmemold,bmsaveold:hbitmap;
hdcmem,hdcback,hdcobject,hdctemp,hdcsave:hdc;
ptsize:tpoint;
begin
transparentcolor:=image.picture.bitmap.canvas.pixels[0,image.height-1];
transparentcolor:=transpatentcolor or $02000000;
hdctemp:=createcompatibledc(dc);
selectobject(hdctemp,image.picture.bitmap.handle);
//选择一个bitmap位图资源
//把位图的尺寸从设备转换到逻辑点
ptsize.x:=image.width;
ptsize.y:=image.height;
dptolp(hdctemp,ptsize,1);
//创建一些设备上下来存储临时的数据
hdcback:=createcompatibledc(dc);
hdcobject:=createcompatibledc(dc);
hdcmem:=createcompatibledc(dc);
hdcsave:=createcompatibledc(dc);
//为每一个设备上下创建一个位图
bmandback:=createbitmap(ptsize.x,ptsize.y,1,1,nil);
bmandobject:=createbitmap(ptsize.x,ptsize.y,1,1,nil);
bmandmem:=createbitmap(dc,ptsize.x,ptsize.y);
bmsave:=cteatecompatiblebitmap(dc,ptsize.x,ptsize.y);
//每个设备上下必须选择一个位图数据来存储象素数据
bmbackold:=selectobject(hdcback,bmandback);
bmobjectold:=selectobject(hdcobject,bmandobject);
bmmemold:=selectobject(hdcmem,bmandmem);
bmsaveold:=selectobject(hdcsave,bmsave);
//设置适当的匹配模式
setmapmode(hdctemp,getmapmode(dc));
//储存发送的位图,因为他将被覆盖
bitblt(hdcsave,0,0,ptsize.x,ptsize.y,hdctemp,0,0,srccopy);
//设置源设备上下的背景的颜色为位图中包含的应该透明的颜色
ccolor:=setbkcolor(hdctemp,transparentcolor);
//通过从源位图到一个单色位图执行一个bitblt函数,为位图创建一个对象屏蔽
bitblt(hdcobject,0,0,ptsize.x,ptsize.y,hdctemp,0,0,srccopy);
//把源设备上下的背景色设回原来的颜色
setbkcolor(hdctemp,ccolor);
//创建对象屏蔽的反颜色
bitblt(hdcback,0,0,ptsize.x,ptsize.y,hdcobject,0,0,notsrccopy);
//把主设备上下的背景色拷贝到目标设备上下中
bitblt(hdcmem,0,0,ptsize.x,ptsize.y,hdc,xstart,ystart,srccopy);
//屏蔽掉位图要放置的位置
bitblt(hdcmem,0,0,ptsize.x,ptsize.y,hdcback,0,0,srcand);
//屏蔽掉位图中透明颜色的象素
bitblt(hdctemp,0,0,ptsize.x,ptsize.y,hdcback,0,0,srcand);
//用目标设备上下文的背景色或位图
bitblt(hdcmem,0,0,ptsize.x,ptsize.y,hdctemp,0,0,srcpaint);
//把目标拷贝到屏幕上
bitble(dc,xstart,ystart,ptsize.x,ptsize.y,hdcmem,0,0,srccopy);
//把原来的位图放在发送的位图里
bitble(hdctemp,0,0,ptsize.x,ptsize.y,hdcsave,0,0,srccopy);
//删除内存设备上下文
deletedc(hdcmem);
deletedc(hdcback);
deletedc(hdcobjeck);
deletedc(hdcsave);
deletedc(hdctemp);
end;
在form1的oncreate事件中添代码:
procedure tform1.formcreate(sender:tobject);
begin
//为两个位图创建图象控制并设置它们的父对象
foreimage:=timage.create(form1);
backimage:=timage.create(form1);
foreimage.parent:=form1;
backimage.parent:=form1;
//装载图象
foreimage.picture.loadfromfile('d:/program files/图象/1.bmp');
foreimage.picture.loadfromfile('d:/program files/图象/1.bmp');
//设置背景色图象大小为它的位图大小
with backimage do
begin
left:=0;
top:=0;
width:=picture.width;
height:=picture.height;
end;
//把前景色图象放在背景色图象的中间
with foreimage do
begin
left:=(badkimage.picture.width-picture.width)div 2;
top:=(badkimage.picture.height-picture.height)div 2;
width:=pictrer.width;
height:=picture.height;
end;
//不显示透明的位图,而是用函数画出来
drawtransparentbitmap(backimage.picture.bitmap.canvas.handle,
foreimage,foreimage.left,foreimage.top);
end;
双击form的 onclose
procedture tform1.formclose(sender:tobject;var action:tcloseaction);
begin
foreimage.free;
backimage.free;
end;
//createbitmap函数:用指定的宽度,高度,颜色面板,象素位数创建一个位图,
hebitmap createbitmap(
int nwidth, //位图宽度
int nheight,//高度
uint cplanes,//颜色面板
unint cbitsperpel,//象素位数
const void *ipvbits//颜色数组的指针位置
);
函数操作成功返回位图句柄,否则返回0
//createcompatiblebitmap函数:创建一个与指定设备上下文相兼容的位图,
hebitmap createcompatiblebitmap(
hdc hdc,//设备上下文句柄
int nwidth,
int nheitht,
);
返回值与createbitmap函数相同。
//createcompatibledc函数:创建一个与设备相兼容的临时内存设备上下文,
hdc createcompatibledc(
hdc hdc
);
//selectobject(
hdc hdc,
hgdiobj hgdiobj //被选定的对象句柄,而且该对象必须已经被创建
);
被选定的对象句柄,而且该对象必须已经被创建,而且是下列之一:bitmap,brush,font,
pen,tegion.同样也可以使用deleteobject函数将这个指针的对象删除,同时释放与该
设备相关的系统资源。
//setmapmaode函数:设置指定设备句柄的匹配模式,
int setmapmaode(
hdc hdc,
int fnmapmode //新的匹配模式,如nglish,mm_himetric.mm_text等
);
//setbkcolor函数:把当前设备的背景色设定为指定的颜色,如果不适应,将使用最近的颜色值,
colorref setbkcolor(
hdc hdc,
colorref crcolor
);
函数操作成功将返回一个colorref类型的颜色值,否则返回clr_invalid.