如果画透明位图(55分)

  • 主题发起人 主题发起人 liguang
  • 开始时间 开始时间
L

liguang

Unregistered / Unconfirmed
GUEST, unregistred user!
在Imagelist中装入位图,在Treeview显示没有问题,但是自己画的时候,没法去掉背景
各位大家该出手时就出手!!!!
 
ImageList.DrawingStyle := dsTransparent;
ImageList.Draw(Canvas, 0, 0);
 
用API:ImageList_Draw
 
楼上两位大侠所说的小弟知道,今天小弟发现了问题的原因.是透明颜色的问题,必不是所有
的透明颜色都可以,好象只是DELPHI中定义过的颜色常量可以.真彩色系的颜色一般不行.
另外最好将图像的背景色指定为clFuchsia颜色,这样一般的图形画出来都将是透明的(必须
将画的位图指定为透明的).
另外楼上两位大侠所说的使用TIMAGELIST类画到是可实,可是小弟不太知道如何将一贴位图
加到TIMAGELIST类中,因为增加一贴位图的时候必须指定这个位图的蔽码.
两位大侠谁把向TIMAGELIST类增加位力的代码贴出来分就给谁.
 
你制作时保证位图的底色为白色。然后添加:
ImageList1.AddMasked(Bmp, clWhite);
或者
ImageList1.AddMasked(Bmp, Bmp.Canvas.Pixels[0, 0]); //前提位图的左上角为底色。
 
一般情况下透明颜色就是你的位图最左上角的像素颜色。
 
自己画吧:(
我就这样做过。
 
呵呵,这问题我刚解决,:)
ver
pBitmap:TBitmap;
begin
pBitmap->LoadFromFile("C:/factory.bmp ");
pBitmap->Transparent = true;
pBitmap->TransparentColor = clWhite;//可以自定义你想屏蔽的颜色,
//最好是单一的,负载的混合色我还不知道:(
Image1->Canvas->Draw(x,y,pBitmap);
end;
应该就可以了,呵呵:)

如果是复杂的颜色,等我在试试看了,呵呵

希望有帮助:)



 
楼上的那位大哥,说的是,不过透明位图好象都是这样画,小弟也知道这个.
 
呵呵,实在是不好意思,看错了问题了,(丢人呀:-( ) 哈哈哈....:D
不过为什么一定要通过TImageList进行加载?,直接点不也一样?
如果有答案也给我一份:)
 
兔子:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
呵呵!见笑了!
function TransparentStretchBlt(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; MaskDC: HDC; MaskX,
MaskY: Integer): Boolean;
const
ROP_DstCopy = $00AA0029;
var
MemDC: HDC;
MemBmp: HBITMAP;
Save: THandle;
crText, crBack: TColorRef;
SavePal: HPALETTE;
begin
Result := True;
if (Win32Platform = VER_PLATFORM_WIN32_NT) and (SrcW = DstW) and (SrcH = DstH) then
begin
MemBmp := GDICheck(CreateCompatibleBitmap(SrcDC, 1, 1));
MemBmp := SelectObject(MaskDC, MemBmp);
try
MaskBlt(DstDC, DstX, DstY, DstW, DstH, SrcDC, SrcX, SrcY, MemBmp, MaskX,
MaskY, MakeRop4(ROP_DstCopy, SrcCopy));
finally
MemBmp := SelectObject(MaskDC, MemBmp);
DeleteObject(MemBmp);
end;
Exit;
end;
SavePal := 0;
MemDC := GDICheck(CreateCompatibleDC(0));
try
MemBmp := GDICheck(CreateCompatibleBitmap(SrcDC, SrcW, SrcH));
Save := SelectObject(MemDC, MemBmp);
SavePal := SelectPalette(SrcDC, SystemPalette16, False);
SelectPalette(SrcDC, SavePal, False);
if SavePal <> 0 then
SavePal := SelectPalette(MemDC, SavePal, True)
else
SavePal := SelectPalette(MemDC, SystemPalette16, True);
RealizePalette(MemDC);

StretchBlt(MemDC, 0, 0, SrcW, SrcH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcCopy);
StretchBlt(MemDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SrcW, SrcH, SrcErase);
crText := SetTextColor(DstDC, $0);
crBack := SetBkColor(DstDC, $FFFFFF);
StretchBlt(DstDC, DstX, DstY, DstW, DstH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcAnd);
StretchBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0, SrcW, SrcH, SrcInvert);
SetTextColor(DstDC, crText);
SetBkColor(DstDC, crBack);

if Save <> 0 then SelectObject(MemDC, Save);
DeleteObject(MemBmp);
finally
if SavePal <> 0 then SelectPalette(MemDC, SavePal, False);
DeleteDC(MemDC);
end;
end;
 
后退
顶部