我已经筋疲力尽了。。。尝试获得自定义图片列表、TImageList和TListView以协同工作。原始问题:列表中没有显示动态添加的图片。把它缩小,问题在TImagelist中。代码如下。ilMain是TImagelist(在其他地方定义)。将位图添加到列表中,立即检索它,首先"绘制"工作正常,但seond失败。。。我在这里错过了什么?
var i:integer;
test:TSch;
currentimage :TBitmap;
stupid :TBitmap;
begin
currentImage:=TBitmap.Create;
stupid:=TBitmap.Create;
ilMain.Clear;
// currentImage.LoadFromFile('C:DelphipiccatpicsMonaLisa.jpg');
JPeg2Bmp('C:DelphipiccatpicsMonaLisa.jpg',currentImage);
form1.canvas.Draw(100,10,currentimage);
ilMain.Add(currentimage,nil);
ilMain.GetBitmap(0,stupid);
form1.canvas.Draw(200,10,stupid);
编辑:
对此进行了进一步的测试;结果非常混乱和不一致。
结果实际上很大程度上取决于输入文件的大小(感谢那个指针,kobik!);似乎所有小于256x256的图片都没有导入到图片列表中,而X轴上的较大图片(有时??)分布在几个项目上。
ilMain设置为256x256像素。
以下是几种输入大小(X X Y,以像素为单位)的输出:950x414第一次绘制显示整个图像,第二次绘制在左上角的256x256像素。然而,TImagelist的三个项目被填充,具有3x 256x256像素:这三个图片可以从主图片中"剪切"出来,但仍然是256x256个像素。所有被切掉的小于256x256的边缘(垂直或水平)都会丢失。
1600x1600导入了六个图像;第一行完整的256x256块,可以从图片的顶部切割。tp右侧的不完整块被省略,Y大小256以下的所有行也被省略。
1500x1000与前一个类似;现在进口了五件商品。
638x376再次相似;现在只有两件"合适"。
197x256(我的原始测试文件,在上面的帖子中描述)无进口物品(X尺寸小于TImaglist X尺寸?)
256x256同样,没有数据导入
257x257仍然没有数据导入
260x260仍然没有数据导入
300x300仍然没有数据导入
512x256非常奇怪的一个。导入一张图片;但它的尺寸缩小了,所以大约70%的原始图片适合(新的)256X尺寸。图片下方添加了一个黑条,以弥补由于缩小而损失的空间。
所以这就是我现在停止测试的地方,我想知道是否有人能在这里透露一些信息。。。?
编辑:设计部分移到了新的问题(见评论kobik中的请求,谢谢伙计!)
假设JPeg2Bmp
是正确的,那么您的代码就可以工作(或者至少需要工作)。我想@Dima的第二条评论是正确的。
您还没有显示ilMain
属性,如果使用默认属性,则会得到一个包含Width/Height=16
的图像列表。
尝试省略对form1.canvas.Draw(100,10,currentimage);
的第一次调用,只绘制form1.canvas.Draw(200,10,stupid);
,您应该在位置200,10处看到一个16x16
图形。
TImagelist
无法加载任意大小的图像
您需要预先定义它的大小,并加载具有合适大小的位图。即创建缩略图以适应图像列表尺寸。
还请注意(您可能知道)您只需要在响应WM_PAINT
消息时绘制。例如在FormOnPaint
事件中。
编辑:关于您的编辑,TImageList
就是这样工作的。如果添加的位图大于图像列表宽度,则会尝试将位图拆分为单独的位图以适应图像列表大小。这是经过设计的。
有关hbmImage
参数:,请参阅有关ImageList_Add
的文档
包含图像的位图的句柄。数字从位图的宽度推断图像的宽度。