⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emaildlg.cpp

📁 蓝天盲人电脑软件
💻 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 + -