반응형
다국어 프로그래밍에대한 정보를 찾다가 알게된 정보이다.
실생시간에 툴바의 툴팁을 바뀌기 위해서는 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 |
} |
반응형
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Cursor] 시스템 커서 불러오기 (0) | 2011.04.14 |
---|---|
[Dialog] 프로그램 최소화 원래대로... (0) | 2011.04.14 |
[이벤트] 마우스 이벤트 (0) | 2011.04.13 |
[Dialog] 폼뷰 외곽 경계선 없애기 (0) | 2011.04.13 |
[Splitter] 분할 윈도우 (0) | 2011.04.13 |
댓글