C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[62] [강좌] VirtualTreeView #4 : 속성 수정 및 이미지출력하기
볼레롱 [bolero] 12854 읽음    2005-06-18 14:32
phonebook2.zip 506KB 수정된 소스와 실행파일
1. 속성 수정



위 그림 처럼, VirtualTreeView는 처음 가져다 놓으면, 

Column 0 -> TreeView 같은 형태이고,

Column 1 이후 -> ListView 같은 형태입니다.

그러므로,

첨부한 그림 같은 것이 아니라  List같은 형태를 원하시면,
Object Inspector 에서 원하는 속성을 수정하여야 합니다.


[List 같은 형태로 바꿀때]

* 한라인 전체 선택 :  TreeOptions -> SelectionOptions -> toFullRowSelect  : true
* Column 0 의  Child와 Parent 사이의 연결관계 표시하는 점선 없애기 :
              TreeOptions -> PaintOptions -> toShowTreeLines  : false
* Column 0 의 앞쪽 여백을 없애기 :   Indent : 0
              Indent는  Child와 부모사이의 들여쓰기 할때의 간격입니다.

이렇게 3가지 속성을 변경하면,
VTV가  List 형태처럼 보이게 됩니다.

이전강좌에서 위 3가지 속성을 수정한 실행 파일을 첨부하였습니다.


2. 이미지 출력하기

BCB에서 메뉴등에 이미지 출력하기 위해서는  ImageList를 사용하잔아요.
VTV도 마찬가지로 이미지 출력을 위해서는 ImageList를 사용하게 됩니다.


[Win32] 팔렛트에서 TImageList 콤포넌트를 폼에 올려 놓습니다.
폼에 올려 놓은 것은 TImageList를 더블클릭해서  첨부화일에 있는 bmp 파일을 등록해 줍니다.
각 이미지의 크기는 24x24 입니다.  TImageList의 Widht 와 Height를 24로 변경해 주신후에
불러와야 합니다.


TVirtualStringTree의 속성에서 Images 속성에 방금전에 올리 ImageList의 이름을 설정합니다.

그럼 이제 이미지를 출력할 준비가 된것이구요.

VTV에 어떤 이미지를  출력할 것인지 알려 주는 메소드를 만들어 주서야 합니다.

Events 중에  OnGetImageIndex 란 메소드가 있는데요.
이것을 구현해 주면 됩니다.


void __fastcall TForm1::VirtualStringTree1GetImageIndex(
      TBaseVirtualTree *Sender, PVirtualNode Node, TVTImageKind Kind,
      TColumnIndex Column, bool &Ghosted, int &ImageIndex)
{
    if (!Node)
        return;

    ImageIndex = 1;
}

위 예제는  무조건 ImageList의  index가 1번이 이미지를 출력하라는 것입니다.
ImageList는 0부터 시작하므로 1은 두번째 이미지가 나오게 됩니다.

그런데  위 코드를 넣고 실행해 보시면 모든 Column에 동일한 이미지가 나오는 것을 보실 수 있습니다.

두번째 첨부한 그림이 그것입니다.

그럼  Column 0 에만 이미지가 나오고,  다른 컬럼에는 안 나오게 하려면 어떻게 할까요?

그것은 Column 파라미터를 이용하면 됩니다.

void __fastcall TForm1::VirtualStringTree1GetImageIndex(
      TBaseVirtualTree *Sender, PVirtualNode Node, TVTImageKind Kind,
      TColumnIndex Column, bool &Ghosted, int &ImageIndex)
{
    if (!Node)
        return;

    if (Column == 0)
        ImageIndex = 1;
}

이렇게 바꾸었습니다.  그러면 Column 0 에만 이미지가 출력 됩니다.


실제 상황에서는 보통 이미지가 모두 동일하게 출력하지는 않지요.

각 라인의 정보에 따라서 이미지를 다르게 출력하는 것이 보통이지요.


그래서, 처음에 만들었던  구조체에  어떤 이미지를 출력할지를 결정하는 변수를 하나 추가 합니다.

typedef struct tagPhonebook {
    AnsiString Name;
    AnsiString Tel;
    AnsiString Sex;
    int ImageIndex;         // 출력할 이미지의 index
} structPhonebook;

그리고,  위의 OnGetImageIndex는

void __fastcall TForm1::VirtualStringTree1GetImageIndex(
      TBaseVirtualTree *Sender, PVirtualNode Node, TVTImageKind Kind,
      TColumnIndex Column, bool &Ghosted, int &ImageIndex)
{
    if (!Node)
        return;

    if (Column == 0)
    {
        structPhonebook *pPhonebook = (structPhonebook *)Sender->GetNodeData(Node);
        ImageIndex = pPhonebook->ImageIndex;
    }
}

이렇게 변경합니다.

즉, 입력한 노드의 데이타에서 ImageIndex를 가져와서 설정하는 방식입니다.


그럼 입력하는 곳에서는 ImageIndex를 지정해 주어야 겠지요.


void __fastcall TForm1::Button1Click(TObject *Sender)
{
    PVirtualNode Node;
    structPhonebook *pPhonebook;

    Node = VirtualStringTree1->AddChild(NULL);
    if (Node)
    {
        pPhonebook = (structPhonebook *)VirtualStringTree1->GetNodeData(Node);
        pPhonebook->Name = "볼레롱";
        pPhonebook->Tel = "02-1234-5678";
        pPhonebook->Sex = "남자";
        pPhonebook->ImageIndex = random(27);
            // ImageList에 추가한 이미지가 27개라서  이사이의 값을 지정하도록
    }
}

Button1Click을  위와 같이 수정하였습니다.


오늘은 여기 까지 입니다.

그럼 수고하세요!

+ -

관련 글 리스트
62 [강좌] VirtualTreeView #4 : 속성 수정 및 이미지출력하기 볼레롱 12854 2005/06/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.