// 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(); } } }