'TCustomTreeView'에서 내림차순으로, TShellTreeView
은 이미지를 즉시 지원합니다. ImageList
은 Images
속성에 할당 할 수 있으며 OnGetImageIndex
이벤트에는 해당 노드 목록의 이미지 색인을 제공 할 수 있습니다. 그의 단점은, 모든 노드가 이미지리스트에서 이미지를 사용해야 할 것입니다
procedure TForm1.ShellTreeView1GetImageIndex(Sender: TObject; Node: TTreeNode);
begin
if TShellFolder(Node.Data).DisplayName = 'RAD Studio' then
Node.ImageIndex := 2;
end;
, 즉 시스템 이미지 목록에서 이미지가 없을 것입니다. 아래 예제는 사용자 정의되지 않는 노드에 대해 시스템 이미지를 검색하는 방법을 보여줍니다. 개인 폴더의 'RAD Studio'폴더에 대한 사용자 지정 이미지를 사용하고 다른 모든 노드에 대한 시스템 이미지를 사용합니다. ImageList1
에는 사용자 정의 이미지가 있고 ImageList2
은 'ShellTreeView'의 'Images'속성에 할당 된 이미지입니다.
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에는 ImageList 속성과 'OnGetImageIndex'속성이 있습니다. (TcxShellTreeView에 대해 몰라). –
@Sertac : 답변으로 게시하면 받아 들일 것입니다 :) – mjn
완료. 그것이 질문에 대한 정확한 대답인지는 확실하지 않습니다. –