透明图象的问题,请帮忙指教! (100分)

  • 主题发起人 主题发起人 jinzuo007
  • 开始时间 开始时间
J

jinzuo007

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
你们好!小弟想实现图象列表框。在listbox的drawitem事件中处理如下:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Bitmap: TBitmap;
Offset: Integer;
ind : integer;
begin
ind := index +1;
with (Control as TListBox).Canvas do
begin
FillRect(Rect);
Offset := 2;
Bitmap := TBitmap.create;
Bitmap.LoadFromFile(GetCurrentDir+'/newface/'+inttostr(ind) +'-1.bmp');
BrushCopy(Bounds(Rect.Left + 4, Rect.Top,
Bitmap.Width, Bitmap.Height),
Bitmap, Bounds(0, 0, Bitmap.Width,
Bitmap.Height), bitmap.Canvas.Brush.Color );
end;
end;
//在窗体上添加一个按钮,在单击事件中给listbox添加项目。
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i : integer;
begin
listbox1.Visible := True;
for i:= 1 to 5 do
begin
listbox1.AddItem(inttostr(i)+'-1',self);
end;
end;
在此,图象已经画出来了。可惜!背景却不是透明的:([:(!] 而且在选中某个item时
获得焦点的兰色会覆盖一部分图象的颜色,所以效果非常差(您可以自己将oicq路径下
的‘newface’目录考到程序目录下运行,其悲惨一看即知!)
小弟想请问如何能使图象成为透明的,而且必须是画上去的,不能用image
控件一副副的load, 还请各位大虾指教,小弟感激不胜!!
 
可以参考一下Infopower里的listbox
 
还请robertcool, 说的详细点。'Infopower'是什么呢?好象是一种语言哈?谢谢了
 
可惜我帮不了你.
 
:) 哦,没关系。还是感谢你哈!
 
方法1: 修改属性;
 
Tense:你能不能再说的详细点?修改什么属性啊?
 
FillRect(Rect);
Offset := 2;

-->
BRUSH.STYLE:=BSCLEAR;//NEW ADD
FillRect(Rect);
Offset := 2;
 
BRUSH.STYLE:=BSCLEAR; 这句是把brush 的 线型变成透明的,那画了和没画不成了
一样的吗? 也就是什么都看不见了??
等我去试试
 
jinzuo007你好, 请试试:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Bitmap: TBitmap;
// Offset: Integer;
ind : integer;
begin
ind := index +1;
with (Control as TListBox).Canvas do
begin
FillRect(Rect);
//Offset := 2;
Bitmap := TBitmap.create;
Bitmap.LoadFromFile('E:/newface/'+inttostr(ind) +'-1.bmp');
TransparentBlt(Handle,Rect.Left + 4, Rect.Top,
Bitmap.Width, Bitmap.Height,Bitmap.Canvas.Handle,
0,0,Bitmap.Width, Bitmap.Height,Bitmap.Canvas.Pixels[0,0]) ;
{
这个函数帮助里找不到,我不知道它在哪些情况下能用,我的是WIN2000。
如果不行,你可以尝试自已写这个函数,应该不很难的。
参数分别为目标地的HDC,目标图像的
起始点坐标X,Y,目标图像的宽度和高度。
原图的HDC、原图的起始X、Y坐标、原图和宽度和长度,
需要设置成透空的颜色的RGB值。}
Bitmap.Free;
end;
end;

我试过了,很好。你的LISTBOX的ItemHeigh要设为32。
 
OnCustomDrawItem()
begin
...
ListBox.Canvas.Brush.Style := bsClear;
ListBox.Canvas.CopyRect(ListBox.ClientRect,Bimap,Rect(0,0,Bitmap.Width,Bitmap.Height));
inherited;
...
end;
 
可以对bitmap进行操作:
bitmap.transparent:=true;
 
Huzzz: 你好!我试了你的方法,果然有效呵呵~~~~,分给您送上呢哈!!:)
并再次向您表示感谢哈!! :))
 

Similar threads

I
回复
0
查看
619
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
614
import
I
I
回复
0
查看
774
import
I
后退
顶部