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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[74] 트리뷰에서 체크박스 쓰기
도난경보기 [] 8577 읽음    2001-02-03 17:46
(운영자: 수정을 못하신다고 하셔서 대신 수정해두었습니다)

안녕하세요? C++ 빌더를 올해 1월부터 쓰기 시작한 빌더 초보 도난경보기 입니다.
저도 트리뷰에서 체크박스를 쓰기 위해 빌더 사이트는 다 뒤지고 다녔는데 마땅한 자료가
없더라구요......
이틀 걸려서 하나 만들어봤는데요.... 도움이 되셨으면 하네요.
일단 진짜 체크박스 컴포넌트를 트리뷰에 집어넣은건 아니구요.....
이미지로 처리를 했습니다.

일단 폼 위에 트리뷰 컴포넌트와 이미지리스트 컴포넌트를 올려놓습니다.
그리고 이미지 리스트에 체크안된 체크박스, 체크된 체크박스, 일부선택된(Gray) 체크박스
그림을 추가합니다.
(폼위에 몇개 올려놓고 화면캡쳐한 다음에 이미지 에디터로 잘라내면 되겠죠...^^)
그러면 ImageIndex 가 차례로 0,1,2 가 됩니다.

트리뷰 컴포넌트의 마우스 다운 이벤트를 처리하시면 되구요...
다음과 같은 코드가 생성이 되죠.
void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{

}

이 안에 다음과 같은 변수를 선언합니다.
    TTreeNode *a;    // 마우스 찍힌 곳의 노드값을 저장할 변수
    THitTests HT;
    HT = TreeView1->GetHitTestInfoAt(X, Y);

이렇게 하면 마우스가 찍은 부분의 X,Y 좌표를 가져오게 되죠.

    if(HT.Contains(htOnIcon))       // 아이콘을 찍었을 경우
    {
//      a = tvLogMask->GetNodeAt(X, Y); // 잘못쓴 부분
        a = TreeView1->GetNodeAt(X, Y); // 찍힌 아이콘에 해당하는 노드를 가져옴

     
    }

그리고 나서 각각의 경우를 다 처리를 해주는데요....
선택된 노드가 차일드는 가지고 있고 패어런트는 안가지고 있을경우,
차일드는 안가지고 있고 패어런트는 가지고 있을 경우,
차일드도 안가지고 있고 패어런트도 안가지고 있을 경우,
차일드도 가지고 있고 패어런트도 가지고 있을 경우.

표로 만들면 이렇게 되겠죠...

경우     차일드     패어런트
=============================
1           O          X
2           X          O
3           X          X
4           O          O
=============================

차일드를 가지고 있는지는 a->HasChildren 를 쓰시면 되구요,
패어런트를 가지고 있는지는 a->Parent 가 NULL 인지 아닌지를 체크하면 되죠.

그리고 이미지를 토글시켜주는 함수 하나 만들면 되구요.

그리고 토글을 시킬때 a 의 ImageIndex 와 SelectedIndex 를 같게 만들어주어야 합니다.
이 작업을 안하면 선택되었을때 앞에 있는 체크박스 그림이 사라지게 되더라구요.

사용된 프로퍼티는
TreeView1->Items->Item->Count, // 아이템의 서브차일드 갯수
TreeView1->Items->Item->AbsoluteIndex,
// 루트로부터의 거리(루트 = 0, 트리가 좌악 펼쳐졌을때 가로 줄번호 라고 생각하시면 됩니다.)
TreeView1->Items->Item->Level, // 들여쓰기된 정도
이정도구요......

사용된 메쏘드는
GetFirstChild(), GetNextChild(), GetLastChild() 입니다.
각 노드가 선택되었을때 어떠한 처리를 해주어야 할지 알고리즘은 알아서 생각하셔야겠죠?
그럼 이만.................

+ -

관련 글 리스트
74 트리뷰에서 체크박스 쓰기 도난경보기 8577 2001/02/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.