📄 ctrlchatframe.cpp
字号:
void CChatFrame::InsertText(LPCTSTR pszToken)
{
int nStart, nEnd;
m_wndEdit.GetSel( nStart, nEnd );
if ( nStart == nEnd )
{
m_wndEdit.ReplaceSel( pszToken );
}
else
{
CString strIn, strOut;
m_wndEdit.GetWindowText( strIn );
if ( nEnd < nStart ) m_wndEdit.GetSel( nEnd, nStart );
strOut.Format( _T("%s%s[/%c]"), pszToken,
(LPCTSTR)strIn.Mid( nStart, nEnd - nStart ), pszToken[1] );
m_wndEdit.ReplaceSel( strOut );
}
m_wndEdit.SetFocus();
}
/////////////////////////////////////////////////////////////////////////////
// CChatFrame text view controller
void CChatFrame::AddText(LPCTSTR pszText)
{
m_pContent.Add( retText, pszText );
m_pContent.Add( retNewline, NEWLINE_FORMAT );
m_wndView.InvalidateIfModified();
}
void CChatFrame::AddText(BOOL bSelf, BOOL bAction, LPCTSTR pszNick, LPCTSTR pszBody)
{
CString str;
if ( Settings.Community.Timestamp )
{
CTime tNow = CTime::GetCurrentTime();
str.Format( _T("[%.2i:%.2i] "),
tNow.GetHour(), tNow.GetMinute() );
m_pContent.Add( retText, str, NULL, retfColour )->m_cColour = RGB( 128, 128, 128 );
}
str.Format( bAction ? _T("* %s ") : _T("%s: "), pszNick );
m_pContent.Add( retText, str, NULL, retfBold | retfColour )->m_cColour
= ( bSelf ? RGB( 255, 0, 0 ) : RGB( 0, 0, 255 ) );
Emoticons.FormatText( &m_pContent, pszBody );
m_pContent.Add( retNewline, NEWLINE_FORMAT );
m_wndView.InvalidateIfModified();
}
/////////////////////////////////////////////////////////////////////////////
// CChatFrame event handlers
void CChatFrame::OnStatusMessage(int nFlags, LPCTSTR pszText)
{
m_pContent.Add( retText, pszText, NULL, retfColour )->m_cColour
= nFlags == 1 ? RGB( 255, 0, 0 ) : RGB( 128, 128, 128 );
m_pContent.Add( retNewline, NEWLINE_FORMAT );
m_wndView.InvalidateIfModified();
}
void CChatFrame::OnLocalText(LPCTSTR pszText)
{
if ( pszText == NULL || *pszText == 0 ) return;
if ( *pszText == '/' )
{
CString strCommand = CString( pszText ).SpanExcluding( _T(" \t") );
strCommand.MakeLower();
if ( strCommand == _T("/me") )
{
OnLocalMessage( TRUE, pszText + 4 );
}
else
{
OnLocalCommand( strCommand, pszText + strCommand.GetLength() + 1 );
}
}
else
{
OnLocalMessage( FALSE, pszText );
}
}
void CChatFrame::OnLocalMessage(BOOL bAction, LPCTSTR pszText)
{
}
void CChatFrame::OnLocalCommand(LPCTSTR pszCommand, LPCTSTR pszMessage)
{
if ( _tcscmp( pszCommand, _T("/clear") ) == 0 )
{
PostMessage( WM_COMMAND, ID_CHAT_CLEAR );
}
else if ( _tcscmp( pszCommand, _T("/connect") ) == 0 )
{
PostMessage( WM_COMMAND, ID_CHAT_CONNECT );
}
else if ( _tcscmp( pszCommand, _T("/disconnect") ) == 0 )
{
PostMessage( WM_COMMAND, ID_CHAT_DISCONNECT );
}
else if ( _tcscmp( pszCommand, _T("/close") ) == 0 )
{
GetParent()->PostMessage( WM_CLOSE );
}
else if ( _tcscmp( pszCommand, _T("/exit") ) == 0 )
{
GetParent()->PostMessage( WM_CLOSE );
}
}
/////////////////////////////////////////////////////////////////////////////
// CChatFrame command handlers
void CChatFrame::OnUpdateChatBold(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( IsInRange( _T("b") ) );
}
void CChatFrame::OnChatBold()
{
if ( IsInRange( _T("b") ) )
InsertText( _T("[/b]") );
else
InsertText( _T("[b]") );
}
void CChatFrame::OnUpdateChatItalic(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( IsInRange( _T("i") ) );
}
void CChatFrame::OnChatItalic()
{
if ( IsInRange( _T("i") ) )
InsertText( _T("[/i]") );
else
InsertText( _T("[i]") );
}
void CChatFrame::OnUpdateChatUnderline(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( IsInRange( _T("u") ) );
}
void CChatFrame::OnChatUnderline()
{
if ( IsInRange( _T("u") ) )
InsertText( _T("[/u]") );
else
InsertText( _T("[u]") );
}
void CChatFrame::OnChatColour()
{
CColorDialog dlg( 0, CC_ANYCOLOR | CC_FULLOPEN );
if ( dlg.DoModal() != IDOK ) return;
COLORREF cr = dlg.GetColor();
CString str;
str.Format( _T("[c:#%.2x%.2x%.2x]"), GetRValue( cr ), GetGValue( cr ), GetBValue( cr ) );
InsertText( str );
}
void CChatFrame::OnChatEmoticons()
{
m_pIconMenu = Emoticons.CreateMenu();
UINT nID = m_wndToolBar.ThrowMenu( ID_CHAT_EMOTICONS, m_pIconMenu, this, TRUE );
delete m_pIconMenu;
m_pIconMenu = NULL;
if ( nID == 0 ) return;
LPCTSTR pszToken = Emoticons.GetText( nID - 1 );
if ( pszToken != NULL ) InsertText( pszToken );
}
void CChatFrame::OnChatClear()
{
m_pContent.Clear();
m_wndView.InvalidateIfModified();
}
void CChatFrame::OnUpdateChatTimestamp(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( Settings.Community.Timestamp );
}
void CChatFrame::OnChatTimestamp()
{
Settings.Community.Timestamp = ! Settings.Community.Timestamp;
}
void CChatFrame::OnUpdateChatConnect(CCmdUI* pCmdUI)
{
BOOL bState = m_pSession != NULL && m_pSession->GetConnectedState() == TS_FALSE;
if ( CCoolBarItem* pItem = CCoolBarItem::FromCmdUI( pCmdUI ) ) pItem->Show( bState );
pCmdUI->Enable( bState );
}
void CChatFrame::OnChatConnect()
{
if ( m_pSession != NULL && m_pSession->GetConnectedState() == TS_FALSE )
{
CWnd* pParent = GetParent();
if ( pParent->IsIconic() ) pParent->ShowWindow( SW_SHOWNORMAL );
pParent->BringWindowToTop();
pParent->SetForegroundWindow();
m_pSession->Connect();
}
}
void CChatFrame::OnUpdateChatDisconnect(CCmdUI* pCmdUI)
{
BOOL bState = m_pSession != NULL && m_pSession->GetConnectedState() != TS_FALSE;
if ( CCoolBarItem* pItem = CCoolBarItem::FromCmdUI( pCmdUI ) ) pItem->Show( bState );
pCmdUI->Enable( bState );
}
void CChatFrame::OnChatDisconnect()
{
if ( m_pSession != NULL ) m_pSession->Close();
}
/////////////////////////////////////////////////////////////////////////////
// CChatFrame message handlers
void CChatFrame::OnTimer(UINT nIDEvent)
{
if ( nIDEvent == 1 )
{
if ( m_pChildWnd != NULL ) m_pChildWnd->SetAlert();
// if ( m_pDesktopWnd != NULL ) m_pDesktopWnd->SetAlert();
}
else if ( nIDEvent == 4 )
{
if ( GetForegroundWindow() != GetTopLevelParent() )
{
CWnd* pParentWnd = GetTopLevelParent();
if ( HINSTANCE hUser = LoadLibrary( _T("User32") ) )
{
BOOL (WINAPI *pfnFlashWindowEx)(PFLASHWINFO pfwi);
if ( (FARPROC&)pfnFlashWindowEx = GetProcAddress( hUser, "FlashWindowEx" ) )
{
FLASHWINFO pFWX;
pFWX.cbSize = sizeof(pFWX);
pFWX.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG;
pFWX.uCount = 3;
pFWX.dwTimeout = 0;
pFWX.hwnd = pParentWnd->GetSafeHwnd();
(*pfnFlashWindowEx)( &pFWX );
}
FreeLibrary( hUser );
}
}
}
}
void CChatFrame::OnSetFocus(CWnd* pOldWnd)
{
CWnd::OnSetFocus( pOldWnd );
m_wndEdit.SetFocus();
}
void CChatFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemWidth = 20;
lpMeasureItemStruct->itemHeight = 22;
}
void CChatFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
CRect rc( &lpDrawItemStruct->rcItem );
Emoticons.Draw( pDC, lpDrawItemStruct->itemID - 1, rc.left + 8, rc.top + 3 );
if ( lpDrawItemStruct->itemState & ODS_SELECTED )
{
pDC->Draw3dRect( &rc, CoolInterface.m_crHighlight, CoolInterface.m_crHighlight );
rc.DeflateRect( 1, 1 );
pDC->Draw3dRect( &rc, CoolInterface.m_crHighlight, CoolInterface.m_crHighlight );
}
else
{
pDC->Draw3dRect( &rc, CoolInterface.m_crWindow, CoolInterface.m_crWindow );
rc.DeflateRect( 1, 1 );
pDC->Draw3dRect( &rc, CoolInterface.m_crWindow, CoolInterface.m_crWindow );
}
}
void CChatFrame::OnClickView(RVN_ELEMENTEVENT* pNotify, LRESULT *pResult)
{
if ( CRichElement* pElement = pNotify->pElement )
{
theApp.InternalURI( pElement->m_sLink );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -