CorpSms/DLG_QXBox_Group_Chat.cpp

413 lines
10 KiB
C++
Raw Normal View History

2025-02-27 16:58:16 +08:00
// DLG_QXBox_Group_Chat.cpp : ʵ<><CAB5><EFBFBD>ļ<EFBFBD>
//
#include "stdafx.h"
#include "CorpSms.h"
#include "DLG_QXBox_Group_Chat.h"
#include "afxdialogex.h"
#include "FQXBox_Group.h"
#include "MainFrm.h"
// DLG_QXBox_Group_Chat <20>Ի<EFBFBD><D4BB><EFBFBD>
#include "..\public\ProxySocket\CBase64Coding.hpp"
IMPLEMENT_DYNAMIC(DLG_QXBox_Group_Chat, CDialogEx)
DLG_QXBox_Group_Chat::DLG_QXBox_Group_Chat(CWnd* pParent /*=NULL*/)
: CDialogEx(DLG_QXBox_Group_Chat::IDD, pParent)
{
m_pSendData = NULL;
m_lSendDataCount = 0;
m_pSendMsg = NULL;
memset(&m_GroupPro,0,sizeof(m_GroupPro));
m_pDlgGroup = (CFQXBox_Group *)pParent;
m_strSend = _T("");
m_bFirstSend = true;
}
DLG_QXBox_Group_Chat::~DLG_QXBox_Group_Chat()
{
}
void DLG_QXBox_Group_Chat::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_QXBOX_GROUP_CHAT_LOG, m_wndLog);
DDX_Text(pDX, IDC_QXBOX_GROUP_CHAT_SEND, m_strSend);
DDV_MaxChars(pDX, m_strSend, 800);
}
BEGIN_MESSAGE_MAP(DLG_QXBox_Group_Chat, CDialogEx)
ON_WM_DESTROY()
ON_BN_CLICKED(IDOK, &DLG_QXBox_Group_Chat::OnBnClickedOk)
ON_WM_SIZE()
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_QXBOX_GROUP_CHAT_SENDBMP, &DLG_QXBox_Group_Chat::OnBnClickedQxboxGroupChatSendbmp)
END_MESSAGE_MAP()
// DLG_QXBox_Group_Chat <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DLG_QXBox_Group_Chat::SetParam(REQ_QXBox_Group_SendData GroupPro,REQ_QXBox_Group_SendData * pSendData,CString * pMsgData , long lCount)
{
if ( m_pSendData )
{delete [] m_pSendData ; m_pSendData = NULL;}
if ( m_pSendMsg )
{delete [] m_pSendMsg ; m_pSendMsg = NULL;}
m_GroupPro = GroupPro;
m_pSendData = pSendData;
m_pSendMsg = pMsgData;
m_lSendDataCount = lCount;
}
BOOL DLG_QXBox_Group_Chat::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>
CString str;
CString strTemp;
if ( _tcslen(m_GroupPro.szMobile)>0 )
str.Format(_T("<EFBFBD><EFBFBD> %s(%s) <20><><EFBFBD><EFBFBD>") , m_GroupPro.szSender,m_GroupPro.szMobile );
else
str.Format(_T("<EFBFBD><EFBFBD> %s <20><><EFBFBD><EFBFBD>") , m_GroupPro.szGroupName );
this->SetWindowText(str);
ShowChatLog();
m_bInit = true;
AddItemToResize(); //<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
return TRUE; // return TRUE unless you set the focus to a control
// <20>쳣: OCX <20><><EFBFBD><EFBFBD>ҳӦ<D2B3><D3A6><EFBFBD><EFBFBD> FALSE
}
void DLG_QXBox_Group_Chat::ShowChatLog2(REQ_QXBox_Group_SendData SendData , CString strMsg , BOOL bShowEnd)
{
CString str;
CString strTemp;
if ( _tcslen(SendData.szMobile)>0 && SendData.lMsgType==4)
strTemp.Format(_T("%s(%s)"),SendData.szSender,SendData.szMobile);
else
strTemp = SendData.szSender;
str.Format(_T("%s %04d.%02d.%02d %02d:%02d:%02d\r\n") , strTemp,SendData.tSubTime.wYear,SendData.tSubTime.wMonth,SendData.tSubTime.wDay,SendData.tSubTime.wHour,SendData.tSubTime.wMinute,SendData.tSubTime.wSecond);
m_wndLog.StartIndent2(0);
m_wndLog.SetColor2(RGB(0,0,255) );
m_wndLog.SetSel(-1,-1); //ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wndLog.ReplaceSel(str);
m_wndLog.StartIndent2(200); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wndLog.SetColor2(RGB(0,0,0) );
if ( SendData.lMsgDataType==0 ) //<2F>ı<EFBFBD>
{
m_wndLog.ReplaceSel(strMsg);
}
else
{
#ifdef _UNICODE
CStringA strD = CW2A(strMsg);
#else
CStringA strD = strMsg;
#endif
long lSize = strD.GetLength();
CByteArray array;
CBase64Coding base64coding;
base64coding.Decode(strD,array);
long nSize = array.GetCount() + 8;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize);
void* pData = GlobalLock(hGlobal);
memcpy(pData, array.GetData(), array.GetCount());
GlobalUnlock(hGlobal);
IStream* pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)
{
HRESULT hr;
LPPICTURE gpPicture=NULL;
HBITMAP hBitmap=NULL;
//OLE_HANDLE m_picHandle;
if ((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture)) == S_OK)
{
gpPicture->get_Handle((OLE_HANDLE*)&hBitmap);
if ( hBitmap )
{
try
{
HBITMAP hAbc = CopyBitmap(hBitmap);
m_wndLog.InsertGraph(hAbc);
//CImageDataObject::InsertBitmap(m_wndLog.GetIRichEditOle(),hBitmap);
}
catch(...)
{
}
/*
//<2F><><EFBFBD>ˣ<EFBFBD>IPicture<72>ӿڽ<D3BF><DABD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>ʼ<E6BFAA><CABC>ͼƬ
//hDC<44><43><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>ͼ<EFBFBD>
HDC hDC = ::GetDC(this->GetSafeHwnd());
long hmWidth=0;
long hmHeight=0;
gpPicture->get_Width(&hmWidth);
gpPicture->get_Height(&hmHeight);
//ת<><D7AA>himetric<69><63><EFBFBD><EFBFBD>Ϊpixels<6C><73><EFBFBD>룬1Ӣ<31><D3A2>=25.4<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nWidth = MulDiv(hmWidth, GetDeviceCaps(hDC, LOGPIXELSX), 2540);
int nHeight = MulDiv(hmHeight, GetDeviceCaps(hDC, LOGPIXELSY), 2540);
RECT rc;
GetClientRect(&rc);
//IPicture::Render<65><72>ʾͼƬ
gpPicture->Render(hDC, 0, 0, nWidth, nHeight, 0, hmHeight, hmWidth, -hmHeight, &rc);
*/
}
gpPicture->Release();
}
pStream->Release();
}
}
str = _T("\r\n\r\n");
m_wndLog.SetSel(-1,-1);
m_wndLog.ReplaceSel(str);
if ( bShowEnd )
m_wndLog.PostMessage(WM_VSCROLL, SB_BOTTOM,0); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʾ
}
void DLG_QXBox_Group_Chat::ShowChatLog()
{
CString str;
CString strTemp;
for ( int i=m_lSendDataCount-1 ; i>=0 ; i-- )
{
if ( i==0 )
ShowChatLog2(m_pSendData[i],m_pSendMsg[i],true);
else
ShowChatLog2(m_pSendData[i],m_pSendMsg[i],false);
}
}
void DLG_QXBox_Group_Chat::OnDestroy()
{
if ( m_pSendData )
{delete [] m_pSendData ; m_pSendData = NULL;}
if ( m_pSendMsg )
{delete [] m_pSendMsg ; m_pSendMsg = NULL;}
CDialogEx::OnDestroy();
try
{
delete this;
}
catch(...)
{
}
}
HBITMAP DLG_QXBox_Group_Chat::CopyBitmap(HBITMAP hSourceHbitmap)
{
CDC sourceDC;
CDC destDC;
sourceDC.CreateCompatibleDC(NULL);
destDC.CreateCompatibleDC(NULL);
//The bitmap information.
BITMAP bm = {0};
//Get the bitmap information.
::GetObject(hSourceHbitmap, sizeof(bm), &bm);
// Create a bitmap to hold the result
HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), bm.bmWidth, bm.bmHeight);
HBITMAP hbmOldSource = (HBITMAP)::SelectObject(sourceDC.m_hDC, hSourceHbitmap);
HBITMAP hbmOldDest = (HBITMAP)::SelectObject(destDC.m_hDC, hbmResult);
destDC.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY );
// Restore DCs
::SelectObject(sourceDC.m_hDC, hbmOldSource);
::SelectObject(destDC.m_hDC, hbmOldDest);
sourceDC.DeleteDC();
destDC.DeleteDC();
return hbmResult;
}
BOOL DLG_QXBox_Group_Chat::ShowFirstSend()
{
CString str;
if ( _ttol(m_GroupPro.szGroupID)<=0 && _tcslen(m_GroupPro.szMobile)>0 )
{
str.Format(_T("<EFBFBD><EFBFBD>򵥸<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>%s(%s)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>!") , m_GroupPro.szSender,m_GroupPro.szMobile);
}
else
{
str.Format(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><EFBFBD>(%s)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>!") , m_GroupPro.szGroupName);
}
int iRet = MessageBox(str,_T("ѡ<EFBFBD><EFBFBD>") , MB_ICONQUESTION|MB_YESNO);
if ( iRet!= IDYES )
return false;
m_bFirstSend = false;
return true;
}
void DLG_QXBox_Group_Chat::OnBnClickedOk()
{
//CDialogEx::OnOK();
if(!UpdateData(true) )
return ;
if ( m_strSend.GetLength()<=0 )
{
MessageBox(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>") ,_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), MB_ICONWARNING );
GetDlgItem(IDC_QXBOX_GROUP_CHAT_SEND)->SetFocus();
return ;
}
m_GroupPro.lMsgDataType = 0;
m_GroupPro.lMsgType = 0; //<2F><><EFBFBD><EFBFBD>
_tcscpy(m_GroupPro.szMsgImageName,_T(""));
_tcscpy(m_GroupPro.szSender,m_pDlgGroup->m_pMainFrame->m_pCurUser->szUser);
if ( m_bFirstSend )
{
if (!ShowFirstSend() )
return ;
}
if ( m_pDlgGroup->SendMsgData(m_GroupPro,m_strSend,_T(""),1)) //<2F><><EFBFBD>ͷ<EFBFBD>ʽΪ1
{
ShowChatLog2(m_GroupPro,m_strSend,true);
m_strSend = _T("");
UpdateData(false);
GetDlgItem(IDC_QXBOX_GROUP_CHAT_SEND)->SetFocus();
}
}
void DLG_QXBox_Group_Chat::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
//if ( !m_bInit ) return;
m_Resizer.Resize(this); //<2F>ƶ<EFBFBD><C6B6>ؼ<EFBFBD>
}
void DLG_QXBox_Group_Chat::AddItemToResize()
{
m_Resizer.Add(this, IDC_QXBOX_GROUP_CHAT_LOG, RESIZE_LOCKRIGHT|RESIZE_LOCKLEFT|RESIZE_LOCKBOTTOM|RESIZE_LOCKTOP);
m_Resizer.Add(this, IDC_QXBOX_GROUP_CHAT_SEND, RESIZE_LOCKRIGHT|RESIZE_LOCKBOTTOM|RESIZE_LOCKLEFT);
m_Resizer.Add(this, IDOK, RESIZE_LOCKRIGHT|RESIZE_LOCKBOTTOM);
m_Resizer.Add(this, IDC_QXBOX_GROUP_CHAT_SENDBMP, RESIZE_LOCKRIGHT|RESIZE_LOCKBOTTOM);
m_Resizer.Add(this, IDCANCEL, RESIZE_LOCKRIGHT|RESIZE_LOCKBOTTOM);
}
void DLG_QXBox_Group_Chat::OnCancel()
{
CDialogEx::OnCancel();
try
{
this->m_pDlgGroup->ChatPop_Del(this);
}
catch(...)
{
}
DestroyWindow();
}
void DLG_QXBox_Group_Chat::OnClose()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
CDialogEx::OnClose();
}
void DLG_QXBox_Group_Chat::OnBnClickedQxboxGroupChatSendbmp()
{
long m_lMaxImageSize = 1024*1024; //ͼƬ<CDBC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>4M
TCHAR szFile[ 256 ]={0};
TCHAR szFileB[ 256 ]={0};
*szFileB = NULL;
OPENFILENAME sOpen;
sOpen.lStructSize = sizeof( sOpen );
sOpen.hwndOwner = this->m_hWnd ;
sOpen.Flags = OFN_EXPLORER|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;
sOpen.lpstrFilter = _T("ͼƬ<EFBFBD>ļ<EFBFBD>\0*.jpg*;*.bmp*;*.gif*\0");
sOpen.lpstrDefExt = _T("");
sOpen.lpstrCustomFilter = NULL;
sOpen.nMaxCustFilter = 0;
sOpen.lpstrFile = szFile;
sOpen.nMaxFile = sizeof( szFile );
sOpen.lpstrFileTitle = szFileB;
sOpen.nMaxFileTitle = sizeof( szFileB );
sOpen.lpstrInitialDir = NULL;
sOpen.lpstrTitle = _T("ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ͼƬ<EFBFBD>ļ<EFBFBD>");
if ( ::GetOpenFileName( &sOpen ) )
{
CString strName = sOpen.lpstrFile;
CString strTemp = strName;
CString strTemp2;
strTemp.MakeUpper();
//<2F>ж<EFBFBD><D0B6>ļ<EFBFBD><C4BC><EFBFBD>չ<EFBFBD><D5B9><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
if ( !(strTemp.Find(_T(".BMP"))>0 || strTemp.Find(_T(".JPG"))>0 || strTemp.Find(_T(".GIF"))>0) ) //ΪExcel<65><6C>ʽ<EFBFBD><CABD><EFBFBD>ļ<EFBFBD>
{
MessageBox(_T("ֻ֧<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ͼƬ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>"),_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),MB_ICONWARNING);
return ;
}
//<2F>ж<EFBFBD><D0B6>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
CFileStatus status;
CFile::GetStatus(strName,status);
if ( status.m_size > m_lMaxImageSize)
{
MessageBox(_T("ͼƬ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>") , _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),MB_ICONWARNING);
return ;
}
m_GroupPro.lMsgDataType = 1; //ͼƬ
m_GroupPro.lMsgType = 0; //<2F><><EFBFBD><EFBFBD>
_tcscpy(m_GroupPro.szMsgImageName,strName);
_tcscpy(m_GroupPro.szSender,m_pDlgGroup->m_pMainFrame->m_pCurUser->szUser);
if ( m_bFirstSend )
{
if (!ShowFirstSend() )
return ;
}
if ( m_pDlgGroup->SendMsgData(m_GroupPro,_T(""),strName,1)) //<2F><><EFBFBD>ͷ<EFBFBD>ʽΪ1
{
CFile file;
CString strDataMsg=strName;
if ( file.Open(strName , CFile::modeRead|CFile::shareDenyNone ) )
{
DWORD lSize = (DWORD)file.GetLength();
2025-02-27 16:58:16 +08:00
if ( lSize<200 * 1024 )
{
BYTE * pData = new BYTE[lSize];
file.Read(pData , lSize);
CBase64Coding base64coding;
base64coding.Encode(pData,lSize,strDataMsg);
delete pData;
}
}
ShowChatLog2(m_GroupPro,strDataMsg,true);
GetDlgItem(IDC_QXBOX_GROUP_CHAT_SEND)->SetFocus();
}
}
}