413 lines
10 KiB
C++
413 lines
10 KiB
C++
// DLG_QXBox_Group_Chat.cpp : 实现文件
|
||
//
|
||
|
||
#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 对话框
|
||
#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 消息处理程序
|
||
|
||
|
||
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: 在此添加额外的初始化
|
||
|
||
CString str;
|
||
CString strTemp;
|
||
if ( _tcslen(m_GroupPro.szMobile)>0 )
|
||
str.Format(_T("与 %s(%s) 聊天") , m_GroupPro.szSender,m_GroupPro.szMobile );
|
||
else
|
||
str.Format(_T("与 %s 聊天") , m_GroupPro.szGroupName );
|
||
this->SetWindowText(str);
|
||
|
||
ShowChatLog();
|
||
|
||
m_bInit = true;
|
||
AddItemToResize(); //加入自动大小控制
|
||
|
||
return TRUE; // return TRUE unless you set the focus to a control
|
||
// 异常: OCX 属性页应返回 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); //选中最后,在最后添加内容
|
||
m_wndLog.ReplaceSel(str);
|
||
|
||
|
||
m_wndLog.StartIndent2(200); //设置缩进
|
||
m_wndLog.SetColor2(RGB(0,0,0) );
|
||
if ( SendData.lMsgDataType==0 ) //文本
|
||
{
|
||
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(...)
|
||
{
|
||
}
|
||
/*
|
||
//至此,IPicture接口建立好,下面开始画图片
|
||
//hDC是外部传入的画图设备
|
||
HDC hDC = ::GetDC(this->GetSafeHwnd());
|
||
long hmWidth=0;
|
||
long hmHeight=0;
|
||
gpPicture->get_Width(&hmWidth);
|
||
gpPicture->get_Height(&hmHeight);
|
||
//转换himetric距离为pixels距离,1英寸=25.4毫米
|
||
int nWidth = MulDiv(hmWidth, GetDeviceCaps(hDC, LOGPIXELSX), 2540);
|
||
int nHeight = MulDiv(hmHeight, GetDeviceCaps(hDC, LOGPIXELSY), 2540);
|
||
RECT rc;
|
||
GetClientRect(&rc);
|
||
//IPicture::Render显示图片
|
||
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); //最后一行显示
|
||
|
||
}
|
||
|
||
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("你将向单个手机号%s(%s)发送消息,请确认是否继续!") , m_GroupPro.szSender,m_GroupPro.szMobile);
|
||
}
|
||
else
|
||
{
|
||
str.Format(_T("你将向整个群组(%s)发送消息,请确认是否继续!") , m_GroupPro.szGroupName);
|
||
}
|
||
int iRet = MessageBox(str,_T("选择") , 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("请先输入内容!") ,_T("错误"), MB_ICONWARNING );
|
||
GetDlgItem(IDC_QXBOX_GROUP_CHAT_SEND)->SetFocus();
|
||
return ;
|
||
}
|
||
m_GroupPro.lMsgDataType = 0;
|
||
m_GroupPro.lMsgType = 0; //发送
|
||
_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)) //发送方式为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); //移动控件
|
||
}
|
||
|
||
|
||
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: 在此添加消息处理程序代码和/或调用默认值
|
||
|
||
CDialogEx::OnClose();
|
||
}
|
||
|
||
|
||
void DLG_QXBox_Group_Chat::OnBnClickedQxboxGroupChatSendbmp()
|
||
{
|
||
long m_lMaxImageSize = 1024*1024; //图片文件最大支持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("图片文件\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("选择发送的图片文件");
|
||
if ( ::GetOpenFileName( &sOpen ) )
|
||
{
|
||
CString strName = sOpen.lpstrFile;
|
||
CString strTemp = strName;
|
||
CString strTemp2;
|
||
strTemp.MakeUpper();
|
||
//判断文件扩展名是否正确
|
||
if ( !(strTemp.Find(_T(".BMP"))>0 || strTemp.Find(_T(".JPG"))>0 || strTemp.Find(_T(".GIF"))>0) ) //为Excel格式的文件
|
||
{
|
||
MessageBox(_T("只支持发送图片文件,请重新选择"),_T("错误"),MB_ICONWARNING);
|
||
return ;
|
||
}
|
||
//判断文件大小是否正确
|
||
CFileStatus status;
|
||
CFile::GetStatus(strName,status);
|
||
if ( status.m_size > m_lMaxImageSize)
|
||
{
|
||
MessageBox(_T("图片文件过大,无法发送,请重新选择") , _T("错误"),MB_ICONWARNING);
|
||
return ;
|
||
}
|
||
|
||
m_GroupPro.lMsgDataType = 1; //图片
|
||
m_GroupPro.lMsgType = 0; //发送
|
||
_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)) //发送方式为1
|
||
{
|
||
CFile file;
|
||
CString strDataMsg=strName;
|
||
if ( file.Open(strName , CFile::modeRead|CFile::shareDenyNone ) )
|
||
{
|
||
DWORD lSize = (DWORD)file.GetLength();
|
||
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();
|
||
}
|
||
}
|
||
}
|