JHB의 프로그래밍 삽질기

[MFC] CTreeCtrl font 관련 설정 바꾸기. 본문

PROGRAMMING/Win/MFC

[MFC] CTreeCtrl font 관련 설정 바꾸기.

roter 2011.07.01 15:03





아래 내용이 일부 틀려서 정정합니다. 20110719.
아래 처럼 할 경우 폰트가 변경 되는 것이 맞긴 한데,
'일본어'등의 특수 문자들을 불러서 Insert하는 경우에 문제가 생긴다.

일본어를 지원하지 않는 폰트가 set돼있는 트리컨트롤에 일본어 String을 insert하려하면 항목이 깨져버린다.
그 이후에 font를 바꿔봤자 이미 삽입된 항목은 깨진 뒤다.
아래서 적은 NMCustomDraw는 삽입 된 뒤에 그려지는 듯 하다.
따라서 font를 적용시킬려면 그냥 CTreeCtrl로 객체를 생성하자마자 SetFont로 폰트를 지정하면 되는 듯 하다.
만약 CTreeCtrl을 상속받은 CustomTreeControl이라면 PreSubclassWindow 메소드에서 SetFont해주도록 하자.


-----------------------------------------------------------------------------------
CTreeCtrl을 상속받아서 Custom으로 컨트롤을 하나 만든 경우,
폰트 관련 설정은 어디서 해줘야할까?

OnPaint 등등에서 계속 시도해 봤지만 되질 않더라...
다른 컨트롤 들은 잘 되던데....

어디서 해야하는지 고민고민하다가 찾아낸 메소드가
OnNMCustomdraw이다. (왜 Draw가 아니고 draw인진 모르겠지만..)
여튼.. MFC에서 CTreeCtrl을 상속받아서 만든 클래스를 클릭하고 Properties에서 Messages부분을 보면
=NM_CUSTOMDRAW 라고 있다. (VS2005 기준)
해당 메세지를 등록해주자.
그 후 내용은 아래와 같은 식으로 써주면 된다.
 
void CCustomTreeCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR);
	
	*pResult = 0;

	switch( pNMCD->dwDrawStage )
	{
	case CDDS_PREPAINT:
		*pResult = CDRF_NOTIFYITEMDRAW;
		return;
	case CDDS_ITEMPREPAINT:
		CFont* pFont =  /*원하는 폰트 관련 설정을 하세요~*/
		::SelectObject( pNMCD->hdc, pFont->GetSafeHandle() );
		*pResult = CDRF_NEWFONT;
	}
}
 
저작자 표시 비영리 변경 금지
신고
0 Comments
댓글쓰기 폼