- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 DelphiXE 中,我使用 tFileOpenDialog 选择一个文件夹,然后在 tListBox 中列出该文件夹中的所有 *.jpg 文件。我允许将列表项拖放到列表中进行自定义排序,以便稍后按顺序显示它们。
我希望能够在文件名旁边绘制图像的缩略图,以便在 ListView 中查看文件时显示类似于 Windows 资源管理器,在 ListView 中文件名左侧有关联的图标同一行。
我发现了几个旧示例,这些示例使我相信使用 tListBox.onDrawItem 可以实现这一点,但我一直无法让其工作。
使用 tListBox 或其他方式实现此目标的最佳方法是什么?
感谢您的帮助。
<小时/>更新:按照建议,我一直在努力使用 tListView。
我尝试将 Ken 和 Andreas 的示例转换为使用实际图像,而不是动态创建的示例位图。我能够使基本功能正常工作,但如果不调整大小,我只能得到图像 64*64 的左上角。目前我只处理 JPG。 imagecount 只是列表框中文件名列表的计数,此时我还没有将初始列表创建移动到 ListView 中。
这是用这段代码完成的:
procedure TfrmMain.CreateThumbnails;
var
i: Integer;
FJpeg: TJpegImage;
R: TRect;
begin
for i := 0 to imageCount - 1 do
begin
FJpeg := TJpegImage.Create;
thumbs[i] := TBitmap.Create;
FJpeg.LoadFromFile(Concat(imgFolderlabel.caption,
photoList.Items.Strings[i]));
thumbs[i].Assign(FJpeg);
thumbs[i].SetSize(64, 64);
end;
imgListView.LargeImages := ImageList1;
FJpeg.Free;
end;
为了在缩略图内正确调整图像大小和拉伸(stretch)图像,我尝试从这里实现一些代码:http://delphi.about.com/od/graphics/a/resize_image.htm
新代码如下所示:
procedure TfrmMain.CreateThumbnails;
var
i: Integer;
FJpeg: TJpegImage;
R: TRect;
begin
for i := 0 to imageCount - 1 do
begin
FJpeg := TJpegImage.Create;
thumbs[i] := TBitmap.Create;
FJpeg.LoadFromFile(Concat(imgFolderlabel.caption,
photoList.Items.Strings[i]));
thumbs[i].Assign(FJpeg);<br/>
//resize code
R.Left := 0;
R.Top := 0;
// proportional resize
if thumbs[i].Width > thumbs[i].Height then
begin
R.Right := 64;
R.Bottom := (64 * thumbs[i].Height) div thumbs[i].Width;
end
else
begin
R.Bottom := 64;
R.Right := (64 * thumbs[i].Width) div thumbs[i].Height;
end;
thumbs[i].Canvas.StretchDraw(R, thumbs[i]);
// resize image
//thumbs[i].Width := R.Right;
//thumbs[i].Height := R.Bottom;<br/>
thumbs[i].SetSize(64, 64); //all images must be same size for listview<br/>
end;
imgListView.LargeImages := ImageList1;
FJpeg.Free;
end;
这为我提供了图像缩略图及其文件名的拼贴画,效果很好。
谢谢。
最佳答案
不是答案,而是替代方案(使用 Andreas 的代码创建图像数组作为起点)。将 TListView 和 TImageList 放在新表单上,将编辑器中的所有代码从界面
剪切到最后结束的上方。
如下:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, ComCtrls;
type
TForm1 = class(TForm)
ImageList1: TImageList;
ListView1: TListView;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
procedure CreateListItems;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
N = 50;
THUMB_WIDTH = 32;
THUMB_HEIGHT = 32;
THUMB_PADDING = 4;
var
thumbs: array[0..N-1] of TBitmap;
procedure CreateThumbnails;
var
i: Integer;
begin
for i := 0 to N - 1 do
begin
thumbs[i] := TBitmap.Create;
thumbs[i].SetSize(THUMB_WIDTH, THUMB_HEIGHT);
thumbs[i].Canvas.Brush.Color := RGB(Random(255), Random(255), Random(255));
thumbs[i].Canvas.FillRect(Rect(0, 0, THUMB_WIDTH, THUMB_HEIGHT));
end;
end;
procedure TForm1.CreateListItems;
var
i: Integer;
begin
for i := 0 to N - 1 do
begin
with ListView1.Items.Add do
begin
Caption := 'Item ' + IntToStr(i);
ImageIndex := i;
end;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
var
i: Integer;
begin
CreateThumbnails;
for i := 0 to N - 1 do
ImageList1.Add(thumbs[i], nil);
ListView1.LargeImages := ImageList1;
CreateListItems;
end;
关于image - 在 tlistbox 中绘制缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412902/
我有一个具有可变数量子元素的固定大小的 div。我不知道 children 的大小。目标是缩小它们以适合父级。 例子: .parent { width: 100px; height: 100p
我是一名优秀的程序员,十分优秀!