MFC 트리컨트롤 하위메뉴 체크 여부에 따른 색변화
윈도우에 보면 트리에 three status 트리가 있다. 완전체크, 반체크, 해제 MFC 트리컨트롤은 기본적으로 지원하지 않아서 찾아보았다.
1) CTreeCtrl 을 상속받은 클래스 CCustomTreeCtrl을 만든다.
2) 메시지의 CUSTOMDRAW를 오버라이드한다.
3) CustomTreeCtrl 클래스에 체크 여부를 검사하는 BOOL GetStatus(HTREEITEM hItem) 함수를 만들어준고 CustomDraw에서 호출하여 체크 여부를 판단한뒤 색에 변화를 준다.
BOOL CCustomTreeCtrl::GetStatus(HTREEITEM hItem)
{
HTREEITEM childItem = GetChildItem(hItem);
while(childItem != NULL)
{
if(GetCheck(childItem))
{
return TRUE;
}
BOOL result = GetStatus(childItem);
if(result == TRUE)
return TRUE;
childItem = GetNextSiblingItem(childItem);
}
return FALSE;
}
void CCustomTreeCtrl::CustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMTVCUSTOMDRAW* pcd = (NMTVCUSTOMDRAW*)pNMHDR;
HTREEITEM hItem;
switch(pcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
hItem = (HTREEITEM)pcd->nmcd.dwItemSpec;
//함수 결과 값이 TRUE면 색변화
BOOL result = GetStatus(hItem);
if(result == TRUE)
{
pcd->clrText = RGB(255,0,0);
pcd->clrTextBk = RGB(255,255,255);
}
pResult = CDRF_DODEFAULT;
break;
}
}
4) 트리컨트롤을 사용하고자 하는곳에서 CCustomTreeCtrl m_treeCtrl; 선언하여 사용하면 된다.
'Programming Lv1 > MFC' 카테고리의 다른 글
MFC 다른 프로그램 창 활성화 시키기 (0) | 2012.01.19 |
---|---|
MFC 간단한 쓰레드 작성 (0) | 2012.01.19 |
MFC 버튼크기에 맞게 이미지 변경하여 보여주기 (0) | 2011.10.17 |
CString을 char*로 변경 (0) | 2011.10.17 |
배열 동적 할당 및 배열 개수 (0) | 2011.08.26 |