從「TCustomTreeView」降序,TShellTreeView
對圖像開箱即用的支持。可以將ImageList
分配給它的Images
屬性,並在其OnGetImageIndex
事件中爲相應節點提供列表中圖像的索引。
這方面的一個缺點是,所有的節點將在圖像列表使用的圖片,那是不會有從系統圖像列表的圖像。以下示例演示瞭如何爲不會自定義的節點檢索系統映像。它爲個人文件夾中的'RAD Studio'文件夾使用自定義圖像,併爲所有其他節點使用系統映像。 ImageList1
保存我們的自定義圖像,ImageList2
是分配給'ShellTreeView'的'圖像'屬性的圖像。
type
TForm1 = class(TForm)
[...]
private
FShellImageList: THandle;
[...]
uses
shellapi, shellctrls, commctrl;
procedure TForm1.FormCreate(Sender: TObject);
var
FileInfo: TSHFileInfo;
ImageWidth, ImageHeight: Integer;
begin
ShellTreeView1.Root := 'rfPersonal';
FShellImageList := SHGetFileInfo('C:\', 0, FileInfo, SizeOf(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON); //'//(pop SO formatting)
ImageList_GetIconSize(FShellImageList, ImageWidth, ImageHeight);
ImageList2.Width := ImageWidth;
ImageList2.Height := ImageHeight;
// Arbitrary count hopefully sufficient enough to be able to hold
// system images. Note that this is a proof of concept, not to be
// intended to be a working design.
ImageList_SetImageCount(ImageList2.Handle, 255);
// Make sure the width/height of ImageList1 is the same.
// Set its size, populate, stretchdraw do whatever necessary..
end;
function GetShellImage(PIDL: PItemIDList; Open: Boolean): Integer;
var
FileInfo: TSHFileInfo;
Flags: Integer;
begin
Flags := SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_SMALLICON;
if Open then Flags := Flags or SHGFI_OPENICON;
SHGetFileInfo(PChar(PIDL), 0, FileInfo, SizeOf(FileInfo), Flags);
Result := FileInfo.iIcon;
end;
procedure TForm1.ShellTreeView1GetImageIndex(Sender: TObject; Node: TTreeNode);
var
ImageIndex, SelectedIndex: Integer;
Icon: TIcon;
begin
if TShellFolder(Node.Data).DisplayName = 'RAD Studio' then begin
Icon := TIcon.Create;
try
ImageList1.GetIcon(0, Icon);
ImageIndex := ImageList_AddIcon(ImageList2.Handle, Icon.Handle);
ImageList1.GetIcon(1, Icon);
SelectedIndex := ImageList_AddIcon(ImageList2.Handle, Icon.Handle);
finally
Icon.Free;
end;
end else begin
ImageIndex := GetShellImage(TShellFolder(Node.Data).AbsoluteID, False);
SelectedIndex := GetShellImage(TShellFolder(Node.Data).AbsoluteID, True);
ImageList_ReplaceIcon(ImageList2.Handle, ImageIndex,
ImageList_GetIcon(FShellImageList, ImageIndex, 0));
ImageList_ReplaceIcon(ImageList2.Handle, SelectedIndex,
ImageList_GetIcon(FShellImageList, SelectedIndex, 0));
end;
Node.ImageIndex := ImageIndex;
Node.SelectedIndex := SelectedIndex;
end;
正如在代碼中所評論的,這不應該用於工作設計;可以使用與「圖像索引」和「系統圖像列表索引」匹配的某種查找,而不是具有大量未使用圖像的圖像列表。
TShellTreeView有一個'Images'屬性 - 可以分配一個ImageList,還有一個'OnGetImageIndex'屬性。 (不知道TcxShellTreeView)。 – 2010-08-20 20:18:08
@Sertac:如果你發佈這個答案,我會接受它:) – mjn 2010-08-21 06:47:24
完成。不知道這是否是問題的確切答案。 – 2010-08-21 16:58:56