2009/02/03

실행시간에 툴바의 툴팁 바꾸기

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

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

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


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


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

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


BOOL GetToolTip( UINT nID, CString& strTipText, CString& /*strMessage*/);
virtual afx_msg BOOL OnToolTipText(UINT nID, NMHDR* pNMHDR,
LRESULT* pResult );

BOOL CMainFrame::GetToolTip( UINT nID, CString& strTipText,
CString& /*strMessage*/)
{
CString strFullString;

switch( nID )
{
case ID_FILE_NEW: // have to handle all toolbar tool tip messages here
theApp.m_Lang.GetMenuTip2( strTipText, _T("ID_FILE_NEW") );
break;

case ID_FILE_OPEN:
theApp.m_Lang.GetMenuTip2( strTipText, _T("ID_FILE_OPEN") );
break;

case ID_FILE_SAVE:
theApp.m_Lang.GetMenuTip2( strTipText, _T("ID_FILE_SAVE") );
break;

case ID_EDIT_CUT:
case ID_EDIT_COPY:
case ID_EDIT_PASTE:
case ID_FILE_PRINT:
case ID_APP_ABOUT:
if (strFullString.LoadString(nID))
AfxExtractSubString ( strTipText, strFullString, 1,'\n');
break;
}

return TRUE;
}

BOOL CMainFrame::OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult )
{
ASSERT ( pNMHDR->code == TTN_NEEDTEXTA || TTN_NEEDTEXTW );

TOOLTIPTEXTA* pTTTA = ( TOOLTIPTEXTA *)pNMHDR;
TOOLTIPTEXTW* pTTTW = ( TOOLTIPTEXTW *)pNMHDR;

CString strTipText;
CString strMessage;

if( GetToolTip( (UINT)pNMHDR->idFrom, strTipText, strMessage))
{
#ifndef _UNICODE
if(pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText,strTipText,_countof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText,strTipText,_countof(pTTTW->szText));
#else
if(pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText,strTipText,_countof(pTTTA->szText));
else
lstrcpyn(pTTTW->szText,strTipText,_countof(pTTTW->szText));
#endif

// change status bar message here need pointer to CMainFrame
// SetMessageText(strMessage);

// ok we handled the message, the buck stops here
return TRUE;

}

// we did not handle the message, pass it on
return CMainFrame::OnToolTipText(nID,pNMHDR,pResult);
}

Original Post : http://neodreamer-dev.tistory.com/246

No comments :

Post a Comment