CorpSms/DLG_QXBox_Group_Chat.cpp
lujiang e17c4ce7ed 重新对窗口布局进行优化,解决缺字的情况。
对图标显示进行了优化,使用gdi+按DPI进行缩放。
2025-04-14 17:24:47 +08:00

413 lines
10 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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