📄 textchatviewer.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2006 Teamviewer GmbH. All Rights Reserved.
// Copyright (C) 2002 Ultr@VNC Team Members. All Rights Reserved.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
//
// If the source code for the program is not available from the place from
// which you received this file, check
// http://www.teamviewer.com/
//
////////////////////////////////////////////////////////////////////////////
#include "stdhdrs.h"
#include "TextChatViewer.h"
#include "vncviewer.h"
#define TEXTMAXSIZE 16384
#define MAXNAMESIZE 128 // MAX_COMPUTERNAME_LENGTH+1 (32)
#define CHAT_OPEN -1 // Todo; put these codes in rfbproto.h
#define CHAT_CLOSE -2
#define CHAT_FINISHED -3
extern char sz_E1[64];
extern char sz_E2[64];
//
//
//
TextChatViewer::TextChatViewer(VNCviewerApp *pApp, ClientConnection *pCC)
{
m_pApp = pApp;
m_pCC = pCC;
m_fTextChatRunning = false;
m_fVisible = true;
m_hDlg = NULL;
m_fPersistentTexts = false;
m_szLocalText = new char [TEXTMAXSIZE];
memset(m_szLocalText, 0, TEXTMAXSIZE);
m_szLastLocalText = new char [TEXTMAXSIZE];
memset(m_szLastLocalText, 0, TEXTMAXSIZE);
m_szRemoteText = new char [TEXTMAXSIZE];
memset(m_szRemoteText, 0, TEXTMAXSIZE);
m_szRemoteName = new char[MAXNAMESIZE];
memset(m_szRemoteName,0,MAXNAMESIZE);
m_szLocalName = new char[MAXNAMESIZE];
memset(m_szLocalName,0,MAXNAMESIZE);
m_szTextBoxBuffer = new char[TEXTMAXSIZE]; // History Text (containing all chat messages from everybody)
memset(m_szTextBoxBuffer,0,TEXTMAXSIZE);
unsigned long pcSize=MAXNAMESIZE;
string rname = TeamviewerInfo::getLocalInfo(tvIdentity);
if(rname == "")
rname = TeamviewerInfo::getLocalInfo(tvID);
if(rname == "")
{
if (GetComputerName(m_szLocalName, &pcSize))
{
if( pcSize >= MAXNAMESIZE)
{
m_szLocalName[MAXNAMESIZE-4]='.';
m_szLocalName[MAXNAMESIZE-3]='.';
m_szLocalName[MAXNAMESIZE-2]='.';
m_szLocalName[MAXNAMESIZE-1]=0x00;
}
}
}
else
strncpy(m_szLocalName, rname.c_str(), MAXNAMESIZE-1);
// Load the Rich Edit control DLL
m_hRichEdit = LoadLibrary( RICHDLL );
if (!m_hRichEdit)
{
//MessageBox( NULL, sz_E1,
// sz_E2, MB_OK | MB_ICONEXCLAMATION );
// Todo: do normal edit instead (no colors)
//cw
//yes we use EDIT instead
//see TextChat::InstallChatArea
}
}
//
//
//
TextChatViewer::~TextChatViewer()
{
if (m_szLocalText != NULL) delete [] m_szLocalText;
if (m_szLastLocalText != NULL) delete [] m_szLastLocalText;
if (m_szRemoteText != NULL) delete [] m_szRemoteText;
if (m_szRemoteName != NULL) delete [] m_szRemoteName;
if (m_szLocalName != NULL) delete [] m_szLocalName;
if (m_szTextBoxBuffer != NULL) delete [] m_szTextBoxBuffer;
m_fTextChatRunning = false;
if(m_hDlg) SendMessage(m_hDlg, WM_COMMAND, IDOK, 0L);
if (m_hRichEdit != NULL) FreeLibrary(m_hRichEdit);
}
//
// Set text format to a selection in the Chat area
//
void TextChatViewer::SetTextFormat(bool bBold /*= false */, bool bItalic /*= false*/
, long nSize /*= 0x75*/, const char* szFaceName /*= "MS Sans Serif"*/, DWORD dwColor /*= BLACK*/)
{
if ( GetDlgItem( m_hDlg, IDC_CHATAREA_EDIT ) ) // Sanity Check
{
CHARFORMAT cf;
memset( &cf, 0, sizeof(CHARFORMAT) ); // Initialize structure
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_COLOR | CFM_FACE | CFM_SIZE;
if (bBold)
{
cf.dwMask |= CFM_BOLD;
cf.dwEffects |= CFE_BOLD;
}
if (bItalic)
{
cf.dwMask |= CFM_ITALIC;
cf.dwEffects |= CFE_ITALIC;
}
cf.crTextColor = dwColor; // set color in AABBGGRR mode (alpha-RGB)
cf.yHeight = nSize; // set size in points
strcpy( cf.szFaceName, szFaceName);
SendDlgItemMessage( m_hDlg, IDC_CHATAREA_EDIT, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf );
}
}
//
//
//
void TextChatViewer::ProcessTextChatMsg()
{
rfbTextChatMsg tcm;
m_pCC->ReadExact(((char *) &tcm) + m_pCC->m_nTO, sz_rfbTextChatMsg - m_pCC->m_nTO);
int len = Swap32IfLE(tcm.length);
if (len == CHAT_OPEN)
{
// Open TextChat Dialog
PostMessage(m_pCC->m_hwndMain, WM_SYSCOMMAND, ID_TEXTCHAT, (LPARAM)0L);
return;
}
else if (len == CHAT_CLOSE)
{
// Close TextChat Dialog
if (!m_fTextChatRunning) return;
PostMessage(m_hDlg, WM_COMMAND, IDOK, 0);
return;
}
else if (len == CHAT_FINISHED)
{
// On Server notif, request FullScreen update
if (!m_fTextChatRunning) return;
m_fTextChatRunning = false;
m_pCC->SendAppropriateFramebufferUpdateRequest();
return;
}
else
{
// Read the incoming text
if (len > TEXTMAXSIZE) return; // Todo: Improve this...
if (len == 0)
{
SetDlgItemText(m_hDlg, IDC_REMOTETEXT_EDIT, "");
memset(m_szRemoteText, 0, TEXTMAXSIZE);
}
else
{
memset(m_szRemoteText, 0, TEXTMAXSIZE);
m_pCC->ReadExact(m_szRemoteText, len);
PrintMessage(m_szRemoteText, m_szRemoteName, RED);
ShowChatWindow(true); // Show the chat window on new message reception
}
}
}
//
//
//
void TextChatViewer::SendTextChatRequest(int nMsg)
{
rfbTextChatMsg tcm;
tcm.type = rfbTextChat;
tcm.length = Swap32IfLE(nMsg);
m_pCC->WriteExact((char *)&tcm, sz_rfbTextChatMsg, rfbTextChat);
return;
}
//
// Output messages in the chat area
//
//
void TextChatViewer::PrintMessage(const char* szMessage,const char* szSender,DWORD dwColor /*= BLACK*/)
{
// char szTextBoxBuffer[TEXTMAXSIZE];
// memset(szTextBoxBuffer,0,TEXTMAXSIZE);
CHARRANGE cr;
GETTEXTLENGTHEX lpG;
lpG.flags = GTL_NUMBYTES;
lpG.codepage = CP_ACP; // ANSI
int nLen = SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT, EM_GETTEXTLENGTHEX, (WPARAM)&lpG, 0L);
if (nLen + 32 > TEXTMAXSIZE )
{
memset(m_szTextBoxBuffer, 0, TEXTMAXSIZE);
strcpy(m_szTextBoxBuffer, "------------------------------------------------------------------------------------------------------------------------\n");
SetDlgItemText(m_hDlg, IDC_CHATAREA_EDIT, m_szTextBoxBuffer);
}
char br[2] = "\0";
SendDlgItemMessage(m_hDlg,IDC_CHATAREA_EDIT,EM_SETSEL,-1,0);
// Todo: test if chat text + sender + message > TEXTMAXSIZE -> Modulo display
if (szSender != NULL) //print the sender's name
{
/*
// Time
char tbuffer[9];
_tzset();
_strtime(tbuffer);
SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT,WM_GETTEXT, TEXTMAXSIZE-1,(LONG)m_szTextBoxBuffer);
cr.cpMax = strlen(m_szTextBoxBuffer); // Select the last caracter to make the text insertion
cr.cpMin = cr.cpMax;
SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT,EM_EXSETSEL,0,(LONG) &cr);
SetTextFormat(false, false, 0x75, "MS Sans Serif", GREY);
_snprintf(m_szTextBoxBuffer, TEXTMAXSIZE-1, "[%s]", tbuffer);
SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT,EM_REPLACESEL,FALSE,(LONG)m_szTextBoxBuffer); // Replace the selection with the message
*/
// Sender
// SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT,WM_GETTEXT, TEXTMAXSIZE-1,(LONG)m_szTextBoxBuffer);
cr.cpMax = nLen; //strlen(m_szTextBoxBuffer); // Select the last caracter to make the text insertion
cr.cpMin = cr.cpMax;
SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT, EM_EXSETSEL, 0, (LONG)&cr);
/***/
SetTextFormat(false, false, 0x75, "MS Sans Serif", dwColor);
_snprintf(m_szTextBoxBuffer, MAXNAMESIZE-1 + 4, "<%s>: ", szSender);
SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT,EM_REPLACESEL,FALSE,(LONG)m_szTextBoxBuffer); // Replace the selection with the message
}
nLen = SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT, EM_GETTEXTLENGTHEX, (WPARAM)&lpG, 0L);
if (szMessage != NULL) //print the sender's message
{
SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT,WM_GETTEXT, TEXTMAXSIZE-1,(LONG)m_szTextBoxBuffer);
cr.cpMax = nLen; //strlen(m_szTextBoxBuffer); // Select the last caracter to make the text insertion
cr.cpMin = cr.cpMax;
SendDlgItemMessage(m_hDlg, IDC_CHATAREA_EDIT,EM_EXSETSEL,0,(LONG) &cr);
/***/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -