📄 emaildlg.cpp
字号:
// EmailDlg.cpp : implementation file
//
#include "stdafx.h"
#include "BlueSky.h"
#include "EmailDlg.h"
#include "KeyBoardDlg.h"
#include "CMimeString.h"
#include "CBase64Algo.h"
#include "msword8.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CEmailDlg dialog
CEmailDlg::CEmailDlg(CWnd* pParent /*=NULL*/)
: CDialog(CEmailDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CEmailDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CEmailDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEmailDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CEmailDlg, CDialog)
//{{AFX_MSG_MAP(CEmailDlg)
ON_WM_LBUTTONDBLCLK()
ON_WM_CTLCOLOR()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEmailDlg message handlers
void CEmailDlg::ClipWindow()
{
CRect rect(417,306,608,606);
ClipCursor(&rect);
}
void CEmailDlg::OnOK()
{
//CDialog::OnOK();
}
void CEmailDlg::OnCancel()
{
}
BOOL CEmailDlg::OnInitDialog()
{
CDialog::OnInitDialog();
brush.CreateSolidBrush(RGB(0,120,220));
SetWindowPos(&CWnd::wndNoTopMost,0,0,1024,768,0);
CString strFilePath = _T("E:\\EmailFile\\*.*");
CFileFind find;
BOOL bFind = find.FindFile(strFilePath);
while (bFind)//查找音乐文件,初始化文件列表
{
bFind = find.FindNextFile();
CString EmailName = find.GetFilePath();
if (EmailName.Right(3) == _T("eml") || EmailName.Right(3) == _T("EML"))
{
EmailList.AddTail(EmailName);
}
}
//hEci = NULL;
pos = EmailList.GetHeadPosition();
if (pos)
{
EmailName = EmailList.GetAt(pos);
index=0;
}
return TRUE;
}
void CEmailDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if (point.y<355) //上一封
{
if(index!=0)
{
index--;
pos=EmailList.FindIndex(index);
EmailName=EmailList.GetAt(pos);
}
}
if (point.y>355 && point.y<405) //阅读邮件
{
ReadEmail();
}
if (point.y>405 && point.y<455) //下一封
{
if(index < EmailList.GetCount()-1)
{
index++;
pos=EmailList.FindIndex(index);
EmailName=EmailList.GetAt(pos);
}
}
if (point.y>455 && point.y<505)
{ /*
CKeyBoardDlg kbDlg;
kbDlg.DoModal();
ClipWindow();
*/
DWORD fl;
CFile file;
file.Open(EmailName,CFile::modeRead);
fl=file.GetLength();
char *pTemp;
pTemp=new char[fl];
file.ReadHuge(pTemp,fl);
GetEmailAttachment(pTemp,fl);
file.Close();
char *p=pTemp;
if(p==NULL)
{
eciSpeakText(_T("无法读取该邮件"),0);
return;
}
//译码
/*
int k = strlen(p)% 4;
if(k)
{
k = 4 - k;
for(int i=0; i<k; i++)
{
p += '=';
}
}
CMimeString s( CMimeString::DECODING, CMimeString::BASE64, (unsigned char *)p ,strlen(p));
HANDLE h = eciNew();
eciAddText(h,s);
eciSynthesize(h);
*/
delete[] pTemp;
}
if (point.y>505 && point.y<555)
{
CDialog::OnCancel();
}
if (point.y>555 && point.y<605)
{
exit(0);
}
if (point.y>=610)
{
}
CDialog::OnLButtonDblClk(nFlags, point);
}
HBRUSH CEmailDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->m_hWnd == m_hWnd)
return brush;
return hbr;
}
void CEmailDlg::OnMouseMove(UINT nFlags, CPoint point)
{
char c=NULL;
switch ((point.y-305)/50)
{
case 0: c='1'; break;
case 1: c='2'; break;
case 2: c='3'; break;
case 3: c='4'; break;
case 4: c='5'; break;
case 5: c='6'; break;
}
if( c!=pointchar)
{
pointchar=c;
switch(c)
{
case '1': eciSpeakText("上 一 封",0); break;
case '2': eciSpeakText("朗读邮件",0); break;
case '3': eciSpeakText("下 一 封",0); break;
case '4': eciSpeakText("邮件设置",0); break;
case '5': eciSpeakText("返 回",0); break;
case '6': eciSpeakText("退出系统",0); break;
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CEmailDlg::OnPaint()
{
CPaintDC dc(this);
CPen pen(PS_INSIDEFRAME,5,RGB(200,180,0));
CFont font,*pOldFont,font2;
font.CreatePointFont(300,_T("楷体_GB2312"));
pOldFont = dc.SelectObject(&font);
CString s = _T("我的邮件");
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(0,220,0));
dc.TextOut(435,100,s,s.GetLength());
CPen *pOldPen = dc.SelectObject(&pen);
dc.SelectStockObject(NULL_BRUSH);
CBrush brush(RGB(220,230,220));
CBrush *pOldBrush = dc.SelectObject(&brush);
dc.Rectangle(412,300,612,610);
CPen pen2(PS_SOLID,1,RGB(200,180,0));
dc.SelectObject(&pen2);
for(int i=0; i<5; i++)
{
dc.MoveTo(412,355+50*i);
dc.LineTo(612,355+50*i);
}
font2.CreatePointFont(160,_T("楷体_GB2312"));
dc.SetTextColor(RGB(255,0,0));
dc.SelectObject(&font2);
dc.TextOut(470,320,_T("上 一 封"));
dc.TextOut(470,370,_T("朗读邮件"));
dc.TextOut(470,420,_T("下 一 封"));
dc.TextOut(470,470,_T("邮件设置"));
dc.TextOut(470,520,_T("返 回"));
dc.TextOut(470,570,_T("退出系统"));
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);
dc.SelectObject(pOldFont);
// Do not call CDialog::OnPaint() for painting messages
}
void CEmailDlg::ReadEmail()
{
DWORD fl;
CFile file;
file.Open(EmailName,CFile::modeRead);
fl=file.GetLength();
char *pTemp,*p;
pTemp=new char[fl];
file.ReadHuge(pTemp,fl);
p=GetEmailBodyText(pTemp,fl);
long ff=strlen(p);
file.Close();
if(p==NULL)
{
eciSpeakText(_T("无法读取该邮件"),0);
return;
}
//译码
int k = strlen(p)% 4;
if(k)
{
k = 4 - k;
for(int i=0; i<k; i++)
{
p += '=';
}
}
CMimeString s( CMimeString::DECODING, CMimeString::BASE64, (unsigned char *)p ,strlen(p));
HANDLE h = eciNew();
eciAddText(h,s);
eciSynthesize(h);
delete[] pTemp;
}
char* CEmailDlg::GetEmailBodyText(char *pMail, DWORD len)
{
DWORD k=0;
char *p,*spaceline;
char str[]="text/plain";
p=strstr(pMail,str);
if(p==NULL) return NULL;
spaceline=strstr(p,"\n\r");
while(*spaceline<31)
spaceline++;
pMail=spaceline;
p=strstr(spaceline,"\n\r");
p--;
*p='\0';
k=strlen(pMail);
char* temp=new char[k];
int row=k/78;
int rem=k%78;
for(int i=0;i<row;i++)
memcpy(temp+i*76,spaceline+i*78,76);
memcpy(temp+row*76,spaceline+row*78,rem);
memcpy(pMail,temp,row*76+rem);
delete[] temp;
return pMail;
}
char* CEmailDlg::GetEmailAttachment(char *pMail, DWORD len)
{
int k=0,t=0,j=0;
char *p,*spaceline,*q,*name_start,*name_end,*name_fore,*filefullname;
CMimeAlgo * mAlgo ,*mName;
CString sWord;
p=strstr(pMail,"attachment");
if(p==NULL) return NULL;
name_start=strstr(p,"\"=?");
name_start+=12;
name_end=strstr(name_start,"?=\"");
int name_len=name_end-name_start;
name_fore=(char*) malloc(name_len);
memcpy(name_fore,name_start,name_len);
unsigned char * filename;
filename=(unsigned char*) malloc(name_len);
mName = new CBase64Algo();
j=(name_len)/4*3;
mName->Decode(&filename,j , (unsigned char*) name_start, name_len);
CFile file1;
filefullname=(char*)malloc(name_len+19);
strcpy(filefullname,_T(""));
strcat(filefullname,_T("E:\\EMailFile\\"));
strcat(filefullname,(char*)filename);
strcat(filefullname,".doc");
file1.Open(filefullname,CFile::modeReadWrite|CFile::modeCreate);
spaceline=strstr(p,"\n\r");
while(*spaceline<31)
spaceline++;
p=spaceline;
q=strstr(spaceline,"\n\r");
q--;
*q='\0';
int nSrc=strlen(p);
int nOutword=nSrc-(nSrc/78)*2;
char* str_w;
str_w = (char*) malloc(nOutword); //动态分配,别忘释放
char* temp=str_w;
while(p!=q)
{
if(*p>30)
{ *temp=*p; temp++; t++;}
p++;
k++;
}
unsigned char * mBuf;
mBuf=(unsigned char*) malloc(t);
mAlgo = new CBase64Algo();
mAlgo->Decode(&mBuf, t, (unsigned char*) str_w, k);
file1.WriteHuge((char*) mBuf, t);
file1.Close();
CString sName;
sName.Format("%s",filefullname);
//以下是打开刚刚保存得word文档,并开始朗读
_Application oWordApp;
COleVariant vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!oWordApp.CreateDispatch(_T("Word.Application"), NULL))
return NULL;
try
{
Documents oDocs;
_Document oDoc;
oDocs = oWordApp.GetDocuments();
oDoc = oDocs.Add(vOpt, vOpt);
oDocs.Open(COleVariant(sName), vOpt, //后台打开WORD
COleVariant((short)true), vOpt, vOpt, vOpt,
vOpt, vOpt, vOpt, vOpt);
Selection oSel;
oSel = oWordApp.GetSelection();
oSel.WholeStory(); //全部选择文本
sWord=oSel.GetText();
//oDocs.Close(vOpt,vOpt,vOpt);
}
catch(COleException *e)
{
LPVOID lpMsg;
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, e->m_sc,
MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT),(LPTSTR) &lpMsg,
0, NULL);
::MessageBox(NULL, (LPCTSTR)lpMsg, _T("COM Error"),
MB_OK | MB_SETFOREGROUND);
::LocalFree( lpMsg );
}
catch(COleDispatchException *e)
{
char msg[512];
sprintf(msg, _T("Run-time error '%d':\n\n%s"),
e->m_scError & 0x0000FFFF, e->m_strDescription);
::MessageBox(NULL, msg, _T("Server Error"),
MB_OK | MB_SETFOREGROUND);
}
oWordApp.Quit(vFalse, vOpt, vOpt);
HANDLE h = eciNew();
eciAddText(h,sWord);
eciSynthesize(h);
free(str_w);
free(mBuf);
free(name_fore);
free(filename);
return pMail;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -