본문 바로가기
C & C++/MFC 컨트롤

[Tip] 실시간 ToolTip 바꾸기

by izen8 2011. 4. 14.
반응형

다국어 프로그래밍에대한 정보를 찾다가 알게된 정보이다.
실생시간에 툴바의 툴팁을 바뀌기 위해서는 TTN_NEEDTEXTA, TTN_NEEDTEXTW 메세지를 받아 처리하면 된다.

TTN_NEEDTEXTA 는 Ascii 형식의 툴팁 데이터를 요구할때 발생하며 Win95에서 발생하고 TTN_NEEDTEXTW는 유니코드 형식의 툴팁 데이터를 요구할 때 발생하며 WinNT 이상에서 발생한다.

이 메세지를 처리하기 위한 메세지 맵을 작성한다.

1 ON_NOTIFY_EX_RANGE( TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
2 ON_NOTIFY_EX_RANGE( TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)

실행시간에 컨트롤 아이디에 맞는 툴팁을 생성하기 위한 함수와 TTN_NEEDTEXTA, TTN_NEEDTEXTW 메세지를 핸들링할 함수를 작성한다.

아래 소스는 다국어 처리를 하기 위한 소스 중 일 부분으로 툴팁에 대한 메세지를 테스트한 내용의 소스이다.

01 BOOL GetToolTip( UINT nID, CString& strTipText, CString& /*strMessage*/);
02 virtual afx_msg BOOL OnToolTipText(UINT nID, NMHDR* pNMHDR, 
03                     LRESULT* pResult );
04   
05 BOOL CMainFrame::GetToolTip( UINT nID, CString& strTipText, 
06         CString& /*strMessage*/)
07 {
08     CString strFullString;
09   
10     switch( nID )
11     {
12     case ID_FILE_NEW:  // have to handle all toolbar tool tip messages here
13         theApp.m_Lang.GetMenuTip2( strTipText, _T("ID_FILE_NEW") );
14         break;
15   
16     case ID_FILE_OPEN:
17         theApp.m_Lang.GetMenuTip2( strTipText, _T("ID_FILE_OPEN") );
18         break;
19   
20     case ID_FILE_SAVE:
21         theApp.m_Lang.GetMenuTip2( strTipText, _T("ID_FILE_SAVE") );
22         break;
23   
24     case ID_EDIT_CUT:
25     case ID_EDIT_COPY:
26     case ID_EDIT_PASTE:
27     case ID_FILE_PRINT:
28     case ID_APP_ABOUT:
29         if (strFullString.LoadString(nID))
30             AfxExtractSubString ( strTipText, strFullString, 1,'\n');
31         break;
32     }
33   
34     return TRUE;
35 }
36   
37 BOOL CMainFrame::OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult )
38 {
39     ASSERT ( pNMHDR->code == TTN_NEEDTEXTA || TTN_NEEDTEXTW );
40   
41     TOOLTIPTEXTA* pTTTA = ( TOOLTIPTEXTA *)pNMHDR;
42     TOOLTIPTEXTW* pTTTW = ( TOOLTIPTEXTW *)pNMHDR;
43   
44     CString strTipText;
45     CString strMessage;
46   
47     if( GetToolTip( (UINT)pNMHDR->idFrom, strTipText, strMessage))
48     {
49 #ifndef _UNICODE
50         if(pNMHDR->code == TTN_NEEDTEXTA)
51             lstrcpyn(pTTTA->szText,strTipText,_countof(pTTTA->szText));
52         else
53             _mbstowcsz(pTTTW->szText,strTipText,_countof(pTTTW->szText));
54 #else
55         if(pNMHDR->code == TTN_NEEDTEXTA)
56             _wcstombsz(pTTTA->szText,strTipText,_countof(pTTTA->szText));
57         else
58             lstrcpyn(pTTTW->szText,strTipText,_countof(pTTTW->szText));
59 #endif
60   
61         // change status bar message here need pointer to CMainFrame
62         // SetMessageText(strMessage); 
63    
64         // ok we handled the message, the buck stops here
65         return TRUE;
66   
67     }
68   
69     // we did not handle the message, pass it on
70     return CMainFrame::OnToolTipText(nID,pNMHDR,pResult);
71 }
반응형

댓글