home > working > C/C++ > Source, Tip

 


Name  
   조규남 
File #1  
   transtree.jpg (57.3 KB)   Download : 87
File #2  
   TransTree.zip (46.8 KB)   Download : 140
Subject  
   뒷배경과 똑같은 배경을 같는 Tree View

subject: Transpatrent, TreeView, Tree, TreeCtrl

배경에 투영되는 TreeControl 이다. 구현 방법만 알고 있다면 Tree뿐 아니라 모든 컨트롤에 적용할 수 있다.

위의 그림을 보면 CView에서 그리는 그라데이션 위로 Tree가 그려진다. 이때 CView가 그린 그라데이션 위에 트리의 검은색 부분만이 그려진다.

방법은 아주 간단하다. 우리가 프로그래밍 할 때 사용되는 모든 윈도우는 사실 그림이다. 그 그림을 위가 클릭하고 드래그 할 때 마다 이벤트를 받아서 처리할 뿐이다.
그러핟면 MFC가 그리는걸 우리가 못 그리게 한 다음에 우리 멋대로 그릴 수 있지 않을까? 그것이 바로 이 컨트롤의 핵심이다!! ^^;

그렇다면 어떻게 할까?

     1. CTreeCtrl을 상속 받아서 Tree Class를 생성한다.
     2. OnPaint와 OnEraseBKgnd를 Overload 해서 아무것도 안하게 한다. (중요하다. 아무것도 하면 안된다. 심지어
       OnPaint를 Overload 했을 때 자동으로 붙는 CPaintDC   dc(this);도 지워야 한다.
     3. CDC * 를 받아서 트리를 그리는 부분을 만든다.
     4. OnLButtonDown과 OnLButtonDBClick을 Overload해서 CTreeCtrl의 원래 함수를 호출하고
       트리 자신을 Invalidate 해준다.  이때 스스로를 부르는 것이 아니라 부모가 Tree의 영역을
       Invalidate하게 해준다. (이부분 때문에 소스가 쪼금 지저분 하다)

이렇게 하면 컨트롤에서 해주어야 할 부분은 끝난다. 그럼 CView에선?
Tree를 View영역에 만들어 준다. 그리고 OnDraw에서 컨트롤 3번에서 만든 함수를 호출해준다. 물론 CDC *를 인자로 넣어주고 이때 더블 버퍼링을 써주어야 깜빡이지 않는다. ^^* CView는 이걸루 끝!

그럼 궁금증이 하나 생긴다. 3번에서 어떻게 Tree를 그리지? Tree에 뭐가 있는지 어떻게 알지?
답은 간단하다. Tree보러 그리게 하면 된다.
CWnd에 DefWindowProc 라는 함수가 있는데 WM 메세지에 대해서 CWnd가 가지는 디폴트 포로시져를 호출해 준다. WM_PAINT에 대한 기본 프로시져를 호출해주면 Tree가 지 생김새를 그릴 것이다.
이때 TransparentBlt라는 함수를 사용해서 하얀 바탕은 그리지 않게 한다.
LButtonDown과 LButtonDBClick에서 기본 프로시져를 호출한 후 Tree자신을 다시 그리면 변경된 모양으로 그림을 그리게 된다.

어렵다구? 소스를 보면 삼척 동자도 다 이해한다. ^^*

ps. 나 스스로 이런 프로그램을 생각해서 만들었다는것이 너무 기쁘다 ^^v



Name Memo Password  
        


Prev
   Sub Classing

조규남
Next
   NCHITTEST를 이용한 다이얼로그 움직이기

조규남


Copyright 1999-2018 Zeroboard / skin by JiYoo / edit by Mystous