반응형
OnCustomDraw 이벤트와 OnCustomDrawItem에벤트를 이용해서 직접 그려줘야 합니다. 배경만 그리는 거면 별 일 아닌데 배경이 그려지면 Item이 그려지는 영역은 그림이 지워집니다. 따라서 버튼, 이미지 및 Text를 일일이 그려줘야 하는 노가다 작업이 필요합니다.
다음 코드는 델파이 헬프에 있는 내용인데 제가 테스트를 하느라고 많이 생략 혹은 수정했습니다. 이미지는 이미지 콤포에 그림을 아무거나 (반드시 BMP파일일 것) 올리시고 컴파일하면 대충 동작하는 모습을 볼 수 있습니다.
이걸 약간만 더 응용, 보완하면 완벽하게 동작하는 나만의 TreeView를 만들수 있습니다.
procedure TForm1.TreeView1CustomDraw(Sender: TCustomTreeView;
const ARect: TRect; var DefaultDraw: Boolean);
begin
with TreeView1.Canvas do begin
Brush.Bitmap := Image1.Picture.Bitmap;
FillRect(ARect);
end;
DefaultDraw := True;
end;
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
NodeRect: TRect;
begin
with TreeView1.Canvas do
begin
if cdsSelected in State then
begin
Brush.Color := clRED;
end;
DefaultDraw := False;
if not DefaultDraw then
begin
if cdsSelected in State then
begin
NodeRect := Node.DisplayRect(True);
FillRect(NodeRect);
end;
NodeRect := Node.DisplayRect(False);
Brush.Style := bsClear;
//아이템의 들여쓰기를 위한 좌표 계산입니다.
NodeRect.Left := NodeRect.Left + (Node.Level * TreeView1.Indent);
// 이 함수에서 하위 노드가 있는지를 확인하고 거기에 맞는
// [+] [-] 버튼을 그려줍니다.
// DrawButton(NodeRect, Node);
NodeRect.Left := NodeRect.Left + TreeView1.Indent;
// 만약 이미지리스트가 연결되어 있다면 이 부분에서
// 이미지를 그립니다.
// DrawImage(NodeRect, Node.ImageIndex);
// 이미지 리스트의 이미지가 그려진 부분을 빼고 나머지 영역에다 글씨를 씁니다.
NodeRect.Left := NodeRect.Left + 10; //ImageList.Width;
TextOut(NodeRect.Left, NodeRect.Top, Node.Text);
end;
end;
DefaultDraw := False;
end;
다음 코드는 델파이 헬프에 있는 내용인데 제가 테스트를 하느라고 많이 생략 혹은 수정했습니다. 이미지는 이미지 콤포에 그림을 아무거나 (반드시 BMP파일일 것) 올리시고 컴파일하면 대충 동작하는 모습을 볼 수 있습니다.
이걸 약간만 더 응용, 보완하면 완벽하게 동작하는 나만의 TreeView를 만들수 있습니다.
procedure TForm1.TreeView1CustomDraw(Sender: TCustomTreeView;
const ARect: TRect; var DefaultDraw: Boolean);
begin
with TreeView1.Canvas do begin
Brush.Bitmap := Image1.Picture.Bitmap;
FillRect(ARect);
end;
DefaultDraw := True;
end;
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
NodeRect: TRect;
begin
with TreeView1.Canvas do
begin
if cdsSelected in State then
begin
Brush.Color := clRED;
end;
DefaultDraw := False;
if not DefaultDraw then
begin
if cdsSelected in State then
begin
NodeRect := Node.DisplayRect(True);
FillRect(NodeRect);
end;
NodeRect := Node.DisplayRect(False);
Brush.Style := bsClear;
//아이템의 들여쓰기를 위한 좌표 계산입니다.
NodeRect.Left := NodeRect.Left + (Node.Level * TreeView1.Indent);
// 이 함수에서 하위 노드가 있는지를 확인하고 거기에 맞는
// [+] [-] 버튼을 그려줍니다.
// DrawButton(NodeRect, Node);
NodeRect.Left := NodeRect.Left + TreeView1.Indent;
// 만약 이미지리스트가 연결되어 있다면 이 부분에서
// 이미지를 그립니다.
// DrawImage(NodeRect, Node.ImageIndex);
// 이미지 리스트의 이미지가 그려진 부분을 빼고 나머지 영역에다 글씨를 씁니다.
NodeRect.Left := NodeRect.Left + 10; //ImageList.Width;
TextOut(NodeRect.Left, NodeRect.Top, Node.Text);
end;
end;
DefaultDraw := False;
end;
반응형