|
1) ImageList에 확대, 축소시의 아이콘을 모두 집어넣고 상태에 따라 번호를 바꾸어 주면 됩니다.
VirtualTreeView의 GetImageIndex 이벤트를 이용합니다.
void __fastcall TFormDCPSelect::TreeDCPGetImageIndex(TBaseVirtualTree *Sender,
PVirtualNode Node, TVTImageKind Kind, TColumnIndex Column, bool &Ghosted,
int &ImageIndex)
{
SDCPTree *dtDCP;
int iLevel;
// 선택과 일반상태의 Node일때
if(Kind == ikNormal | Kind == ikSelected){
// Node가 가지는 구조체얻기
dtDCP = (SDCPTree *)Sender->GetNodeData(Node);
// ImageList에 홀수(1,3,5...)는 축소아이콘
// ImageList에 짝수(0,2,4...)는 확대아이콘
// Node의 Level(깊이, 즉 최상위 Node로 부터 몇번째 Child인지) 구하기
iLevel = Sender->GetNodeLevel(Node);
// 현재 Node가 확장 상태인지 판단
// ImageIndex는 현 Node의 이미지를 그릴 ImageList Index
if(Sender->Expanded[Node]){
// Expand
ImageIndex = iLevel * 2 + 1;
}else{
// Collapse
ImageIndex = iLevel * 2;
}
}
}
2) 아래는 확대/축소에 관계된 VirtualTreeView Demo소스입니다. 저도 이거보고 했습니다^^ 다른방법은 몰겠네요.
procedure TDrawTreeForm.VDT1GetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind;
Column: TColumnIndex; var Ghosted: Boolean; var Index: Integer);
var
Data: PShellObjectData;
begin
if Column = 0 then
begin
Data := Sender.GetNodeData(Node);
case Kind of
ikNormal,
ikSelected:
begin
if Sender.Expanded[Node] then
Index := Data.OpenIndex
else
Index := Data.CloseIndex;
end;
ikOverlay:
if (Data.Attributes and SFGAO_SHARE) <> 0 then
Index := 0
else
if (Data.Attributes and SFGAO_LINK) <> 0 then
Index := 1;
end;
end;
end;
|