'MFC'에 해당되는 글 6건

  1. 2009/09/22 [MFC] CTreeCtrl의 각 아이템 Height 조절
2009/09/22 01:08


1. CTreeCtrl

MFC를 이용해서 메신저 프로그램을 개발할때 친구목록(버디)을  표시하기 위해서 보통 CTreeCtrl을 사용합니다.

하지만 기본 CTreeCtrl만 가지고서는 부족한 부분이 많습니다.

그래서 많은 개발자분들이 CTreeCtrl을 상속해서 각자의 입맛에 맞추어서 Tree 컨트롤을 만듭니다.

저도 업무의 중하나가 그런 TreeCtrl을 개발하는 일인데 TreeCtrl의 각 아이템의 높이를 조절할 필요가 생겼습니다.

하지만 전체적인 아이템의 높이를 조절하는 SetItemHeight 함수밖에 없더군요.

방법을 생각하다가 OnCustomDraw을 이용해서 TreeCtrl을 그려줄때 아이템을 구분해서 SetItemHeight함수를 불러주었습니다.

하지만 OnCustomDraw안에서 SetItemHeight을 호출하면 정상적으로 동작하는것처럼 보이긴 하나 이내 GUI가 멈춰버리는 현상이 발생하네요.

아마도 OnCustomDraw으로 전달되는 값중에 이미 각 아이템의 높이 값이 전달되었는데 다시 높이 조절함수를 호출해서 그런것 같았습니다.

그래서 열심히 구글링 한결과 드디어 발견했습니다.

2. Height 조절 방법

바로 InsertItem하기 전에 Height를 설정해주는거죠.

하지만 일반적으로 TreeCtrl에 Insert할때 Height를 조절하는 값이 없죠!!!

위 코드에서 선언한 TV_INSERTSTRUCT 구조체를 MSDN으로 자세히 봅시다.

 typedef struct tagTVINSERTSTRUCT {
    HTREEITEM hParent;
    HTREEITEM hInsertAfter;
#if (_WIN32_IE >= 0x0400)
    union
    {
        TVITEMEX itemex;
        TVITEM item;
    } DUMMYUNIONNAME;
#else
    TVITEM item;
#endif
} TVINSERTSTRUCT, *LPTVINSERTSTRUCT;

 

저중에 주의 깊게 살펴볼 부분이 바로 union으로된 부분입니다.

보통은 TVITEM item을 사용하지만 TVITEMEX라는 것도 있군요. (이름만 봐서도 먼가 확장되었다는 느낌이 듭니다.)

다시 MSDN을 이용해서 TVITEMEX 구조체를 살펴봅시다.


 typedef struct tagTVITEMEX {
    UINT mask;
    HTREEITEM hItem;
    UINT state;
    UINT stateMask;
    LPTSTR pszText;
    int cchTextMax;
    int iImage;
    int iSelectedImage;
    int cChildren;
    LPARAM lParam;
    int iIntegral;
} TVITEMEX, *LPTVITEMEX;

 

TVITEM과 거의 비슷하지만  맨 아래보면 int ilntegral 변수가 보이네요.

iIntegral
Height of the item. This height is in increments of the standard item height (see TVM_SETITEMHEIGHT). By default, each item gets one increment of item height. Setting this member to 2 will give the item twice the standard height; setting this member to 3 will give the item three times the standard height; and so on. The tree-view control does not draw in this extra area. This extra space can be used by the application for drawing when using custom draw.

번역하자면 기본 Height를 배수로 늘리는 변수입니다.

즉 기본 Height값이 15이고 iIntegral변수에 2를 설정하면 해당 아이템은 Height가 30이 된다는 이야기입니다.

 

자 이제 실제 적용해봅시다.

저는 아래 코드와 같이일반적으로 Insert하는 코드에 저 부분을 추가하였습니다.

이렇게 하면 될것 같은데 아무리 해도 적용이 안되더군요.

한참만의 삽질끝에 방법을 찾았습니다. 

TVITEMEX itemex, TVITEM item이 union으로 되어있음을 잘 보셔야 합니다.

그래서 이런식으로 해주면 적용이 됩니다.

3. 최종결과

최종적용된 TreeCtrl의 화면입니다.

보시는 것처럼 그룹인 아이템과 친구목록(버디)인 아이템의 높이가 다름을 알수있습니다.

 

 

 

저작자 표시
Posted by 세라피안

트랙백 주소 - http://serapian.pe.kr/trackback/334 관련글 쓰기

  1. Subject: 세라피안의 생각  삭제

    2009/09/22 01:12 | Tracked from serapian's me2DAY

    [Blog][MFC] CTreeCtrl의 각 아이템 Height 조절 http://durl.me/5w7r

댓글을 달아 주세요