2010-08-19 2 views
2

NetBeans IDE의 "프로젝트 열기 ..."대화 상자 (아래 이미지 참조)에는 해당 폴더의 프로젝트 유형에 따라 폴더 심볼에 대한 사용자 정의 아이콘을 사용하는 좋은 기능이 있습니다."폴더 찾아보기"대화 상자에서 어떻게 사용자 정의 아이콘을 사용할 수 있습니까?

예를 들어, 폴더에 pom.xml 파일이 있으면 Maven 프로젝트 심볼이 나타납니다.

Windows 표준 대화 상자 또는 기본 폴더 아이콘을 덮어 쓸 수있는 셸 뷰 컨트롤에 확장 지점이있을 수도 있습니다.

지금까지 알고있는 모든 솔루션에는 시스템 전체의 변경이 필요하지만 시스템 수정없이 현재 응용 프로그램에서만 작동하는 솔루션이 있습니까?

alt text

업데이트 : 사용자 정의 대화의 시작 지점으로 제안 VCL 컴포넌트, 나는 TShellTreeView 또는 TcxShellTreeView를 사용할 수 있을까?

+0

TShellTreeView에는 ImageList 속성과 'OnGetImageIndex'속성이 있습니다. (TcxShellTreeView에 대해 몰라). –

+0

@Sertac : 답변으로 게시하면 받아 들일 것입니다 :) – mjn

+0

완료. 그것이 질문에 대한 정확한 대답인지는 확실하지 않습니다. –

답변

2

'TCustomTreeView'에서 내림차순으로, TShellTreeView은 이미지를 즉시 지원합니다. ImageListImages 속성에 할당 할 수 있으며 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; 

코드에서 언급했듯이 실제 디자인에서는이를 사용하지 말아야합니다. 사용되지 않는 이미지가 많은 이미지리스트 대신 '이미지 인덱스'및 '시스템 이미지리스트 인덱스'와 일치하는 일종의 룩업을 사용할 수 있습니다.

1

IShellIconOverlayIShellIconOverlayIdentifier 인터페이스는 오버레이 아이콘 셸 확장을 빌드하는 데 사용되며이 확장은 응용 프로그램별로 시스템 전체가 아니며 델파이에서는 두 인터페이스가 모두 ShlObj 유닛에 있습니다.

검사 예

UPDATE 내가 생각

귀하의 질문에 게시 된 넷빈즈 IDE 대화 상자를 이십 기가 바이트이 링크는 자신의 대화 상자를 그립니다 사용자 지정 아이콘 및 표준 컨트롤 사용 표준 vcl 컨트롤을 사용하여 자신 만의 대화 상자를 구축하는 것과 동일한 효과를 얻을 수 있습니다.

+0

이 예에서는 아이콘 오버레이 처리기를 레지스트리에 등록해야한다고 나와 있습니다. 따라서 이러한 인터페이스가있는 현재 응용 프로그램에만 오버레이를 정의 할 수없는 것처럼 보입니까? – mjn

+0

@mjustin, 이러한 인터페이스는 Windows 셸 확장에서 사용되므로 시스템 전체에 적용됩니다. – RRUZ

관련 문제