MFC/개념 정리

[MFC] CToolTipCtrl 사용법

luckybee 2023. 1. 2. 00:49
728x90
반응형

보통 컴퓨터를 사용하다 보면 어떠한 아이콘에 마우스 포인터를 길게 갖다 놓을 때가 있다. 이 경우 컴퓨터에서는 툴팁이라는 기능을 제공한다. 예를 들어 내 PC 아이콘에 마우스 포인터를 길게 갖다 놨으면, 툴팁은 아래와 같다.

툴팁 예시

이제 예제를 만들어 보겠다. Dialog에서 아래와 같이 버튼을 만들었다.

툴팁 예제를 위한 버튼

첫 번째로 헤더에서 아래와 같이 선언을 해준다.

CToolTipCtrl m_ctrl_tip_ctrl[4]; //툴팁 사용을 위해 .h에 CToolTipCtrl객체 생성

 

두 번째로 OnInitDialog()에서 툴팁이 출력될 컨트롤의 ID목록과 문구를 배열을 만든다.

// 툴팁이 출력될 컨트롤의 ID 목록
int ctrl_id[MAX_CTRL_TIP_COUNT] = { IDC_TEST1_BTN, IDC_TEST2_BTN, IDOK, IDCANCEL };

// 컨트롤 기반으로 출력되는 툴팁의 내용
const wchar_t *p_string[MAX_CTRL_TIP_COUNT] = { 
	L"툴팁 테스트 1 테스트를 위해 길게 글을 입력합니다.", 
	L"툴팁 테스트 2 \n테스트를 위해 길게 글을 입력합니다.", 
	L"확인 버튼입니다~", 
	L"취소 버튼입니다~"
};

이제 반복문으로 툴팁을 위한 코드를 작성한다.

 

for (int i = 0; i < 4; i++) {   //현재 버튼 컨트롤이 4개이니까 반복문은 4
	// 툴팁 컨트롤을 생성한다.
	m_ctrl_tip_ctrl[i].Create(this);

    // 툴팁이 출력될 컨트롤의 주소와 툴팁 내용을 지정한다.
	m_ctrl_tip_ctrl[i].AddTool(GetDlgItem(ctrl_id[i]), p_string[i]);
	
    // 툴팁에 사용할 내용이 너무 긴 경우에 한줄로 표시되면 사용자가 불편할 수 있다.
	// 이런 경우에는 툴팁의 폭을 제한하여 여러줄로 출력하게 만들면 된다.
	// 명시한 툴팁 내용의 폭이 150을 넘어서면 다음줄로 넘겨서 출력한다.
    m_ctrl_tip_ctrl[i].SetMaxTipWidth(150);
	
    // 툴팁에 별다른 설정을 하지 않으면 툴팁이 출력되었다가 일정시간이 지나면
	// 사라져 버린다. 보통 이 시간이 너무 짧아서 사용자가 불편함을 느끼는 경우가 있는데
	// 이러한 경우에는 아래의 코드처럼 시간을 늘려주면 된다.
	// 툴팁의 출력지속 시간을 20초로 늘린다. ( 20000 -> 20초 )
	m_ctrl_tip_ctrl[i].SetDelayTime(TTDT_AUTOPOP, 20000);
}

 

그리고 클래스 마법사에서 가상함수 PreTranslateMessage 함수를 추가해주고, 코드는 아래와 같다.

if (WM_MOUSEMOVE == pMsg->message) {  // 마우스가 이동할때 체크한다.
	// 툴팁이 출력될 컨트롤에 마우스가 위치했는지 확인하고 출력 여부를 결정한다.
	for (int i = 0; i < 4; i++) m_ctrl_tip_ctrl[i].RelayEvent(pMsg);
}

PreTranslateMessage 함수를 넣음으로써, 마우스가 버튼에 위치했는지 확인한다.

 

RelayEvent 함수가 처리하는 메시지의 종류는 아래와 같다.

RelayEvent가 처리하는 메시지

실행화면은 아래와 같다.

툴팁 실행화면

728x90
반응형