블로그 이미지
평강왕자

카테고리

분류 전체보기 (35)
Programming Lv1 (32)
Programming LV2 (0)
취미 (3)
Total
Today
Yesterday

달력

« » 2025.1
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글


윈도우에 보면 트리에 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; 선언하여 사용하면 된다.

Posted by 평강왕자
, |


버튼에 이미지를 씌워야 하는데 그림파일이 버튼 크기보다 크면 이미지의 일부만 보인다.
그경우 이미지를 버튼크기에 맞게 다시 재설정을 해줘야 한다.

CString imagePath = _T("..\\picture\\picture.bmp");

CImage img;

img.Load(imagePath);

//버튼 크기에 맞게 이미지 재설정
 CDC dc;
 CRect rect;
 dc.Attach(lpDrawItemStruct->hDC);

 rect = lpDrawItemStruct->rcItem;

 CDC* pMDC = new CDC;

 pMDC->CreateCompatibleDC(&dc);

 CBitmap* pb = new CBitmap;
 pb->CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());

 CBitmap* pob = pMDC->SelectObject(pb);

 pMDC->SetStretchBltMode(HALFTONE);

 img.StretchBlt(pMDC->m_hDC,-1,-1,rect.Width()+2,rect.Height()+2,0,0,img1.GetWidth(),img1.GetHeight(),SRCCOPY);

 pMDC->SelectObject(pob);
 CImage new_image;
 new_image.Attach((HBITMAP)(*pb));

 new_image.BitBlt(dc,rect.left,rect.top,SRCCOPY);

리소스의 버튼 속성의 Bitmap을 TRUE로 해줘야 한다.

p.s 해당 소스는 OnDrawItem을 상속받아 작성한 샘플입니다.

Posted by 평강왕자
, |

CString을 char*로 바꿔야 하는데
그냥 캐스팅을 하면 잘 안된다.

그래서 wcstombs을 사용하여 변환해 주는 방법을 사용 할 수 있다.

CString strCString = _T("TEST 문자열");
int strLen = strCString.GetLength();

char* strChar = new char[2*strLen + 1];
wcstombs(strChar, (wchar_t*)strCString.GetBuffer(0), 2*len + 1);

사용하여 변경할수 있다.
Posted by 평강왕자
, |

최근에 달린 댓글

글 보관함