본문 바로가기

MFC

[MFC] CListctrl, CTreectrl Drag And Drop 오류 (No Text Error)

리스트컨트롤이나, 트리컨트롤에서 드래그 앤 드랍을 사용할 경우 아래와같은 문제가 발생할 때가 있다.

사진출처) 구글 검색



원인은 XP부터 생겨난 ClearType 글꼴의 안티앨러싱(?)설정 때문..

해결방법은 드래그 이미지를 생성하는 CreateDragImage함수 호출전에 안티앨러싱을 제거한 폰트를 설정하고,

호출이 종료되면 원설정의 폰트상태로 복구하는 것.


주의할 사항) Font는 지역변수가 아닌, 전역/멤버변수로 선언하여 프로그램이 실행되는 동안 객체가 유지되어야 한다.

CFont설정 참조: http://ogoons.tistory.com/43


적용 코드) 현재 코드는 트리컨트롤일때를 가정했지만, 리스트컨트롤의 경우에도 몇몇 설정을 제외하고는 동일하다.

//CFont 선언

CFont *m_pDragFont;

CFont *m_pOldFont;


//Font 초기화

//원상태의 폰트

m_pOldFont = new CFont();

m_pOldFont = m_ctrlTagTree.GetFont();


//안티앨러싱 제거 폰트(따로 안티앨러싱을 제거할수 있으나, 지금은 안티앨러싱을 사용하지 않는 폰트를 사용함)

//'MS Sans Serif'대신 따로 사용할 폰트명으로 작성가능

m_pDragFont = new CFont();

m_pDragFont->CreateFont(9, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET

, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "MS Sans Serif");


//CreateDragImage 호출 시,

//Non 안티앨러싱 제거 폰트 설정

SendMessageToDescendants(WM_SETFONT, (WPARAM)m_pDragFont->GetSafeHandle(), 1, TRUE, FALSE); 

//CreateDragImage 호출

m_pImgListDrag = m_ctrlTagTree.CreateDragImage(pNMTreeView->itemNew.hItem);

//원상태 복귀

SendMessageToDescendants(WM_SETFONT, (WPARAM)m_pOldFont->GetSafeHandle(), 1, TRUE, FALSE); 


따로 CreateDragImage 함수를 만든 경우도 있으니, 참조..

http://www.jiniya.net/tt/594