邮件客户端系统的设计与实现-毕业设计_第1页
邮件客户端系统的设计与实现-毕业设计_第2页
邮件客户端系统的设计与实现-毕业设计_第3页
邮件客户端系统的设计与实现-毕业设计_第4页
邮件客户端系统的设计与实现-毕业设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

页1绪论1.1研究背景随着改革开放的深入发展,社会主义市场经济的建立,信息化时代的步伐不断加快。根据最新公布的2006-2020国家信息化发展战略,信息化是充分利用信息技术,开发利用信息资源,促进信息交流和知识共享,提高经济增长质量,推动经济社会发展转型的历史进程[1]。电子邮件是当前信息化时代中不可缺少的重要通信手段。电子邮件是—种用电子手段提供信息交换的通信方式,是Internet应用最广的服务:通过网络的电子邮件系统,用户可以用非常低廉的价格(不管发送到哪里,都只需负担电话费和网费即可),以非常快速的方式(几秒钟之内可以发送到世界上任何你指定的目的地),与世界上任何一个角落的网络用户联系,这些电子邮件可以是文字、图像、声音等各种方式。同时,用户可以得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。这是任何传统的方式也无法相比的。正是由于电子邮件的使用简易、投递迅速、收费低廉,易于保存、全球畅通无阻,使得电子邮件被广泛地应用,它使人们的交流方式得到了极大的改变。电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。电子邮件系统又称基于计算机的邮件报文系统。它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。电子邮件不仅可利用电话网络,而且可利用任何通信网传送。在利用电话网络时,还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。最重要的是,电子邮件是整个网间网,以至所有其他网络系统中直接面向人与人之间信息交流的系统,它的数据发送方和接收方都是人,所以极大地满足了大量存在的人与人通信的需求[2]。在高度信息化的今天,灵活和便捷地使用电子邮件,对提高工作效率、贯彻国家信息化发展战略意义重大。1.2研究现况经过在网上的查找,发现有关于电子邮件的管理系统有:“WindowsLiveMailDesktop”,它将桌面软件的功能性与基于Web的电子邮件的灵活性结合在一起,轻松接收新闻组和RSS源,在脱机状态下撰写、删除及管理电子邮件;即时添加关于任何信息的WindowsLiveSpaces网络日志项与WindowsLiveMessenger联系人保持密切联系,也可以创建并编辑照片电子邮件[3];“KooMail”它支持分割发送大邮件并且接收后自动合并,对分割发送的邮件支持断点续传,其中邮件模板支持附件主题等,具有发送邮件加密功能使邮件更安全,实现邮件的过滤和规则功能;发送邮件无须SMTP服务器,具有多种邮件编码支持各国语言字符集邮件彻底与乱码告别;可以选择先接收较大或较小的邮件从而优化收邮件列表;能定时发送邮件[4]。“梦幻快车(DreamMail)”它支持SMTP、eSMTP、POP3、Hotmail、Yahoo等邮件协议,真正采用多线程高速收发邮件。附带增强型远程管理,可以直接查看服务器上邮件的内容、直接删除邮件;具有邮件过滤器、黑名单及白名单等组合使用能有效对付垃圾邮件;能自动检测破坏性邮件增强系统安全。另外,梦幻快车通过特有的破乱码技术轻松对付各种乱码邮件。此外,它还集成了许多特色功能,比如:添加账号时自动检索POP3/SMTP服务器、可以自定义动态滚动新闻、支持显示发件人地址及插入邮件表情等等[5]。“Foxmail”它是由原华中理工大学张小龙开发的一款优秀的国产电子邮件客户端软件,2005年3月16日被“腾讯”收购。新的Foxmail具备强大的反垃圾邮件功能。它使用多种技术对邮件进行判别,能够准确识别垃圾邮件与非垃圾邮件。垃圾邮件会被自动分捡到垃圾邮件箱中,有效地降低垃圾邮件对用户干扰,最大限度地减少用户因为处理垃圾邮件而浪费的时间。数字签名和加密功能在Foxmail5.0中得到支持,可以确保电子邮件的真实性和保密性。通过安全套接层(SSL)协议收发邮件使得在邮件接收和发送过程中,传输的数据都经过严格的加密,有效防止黑客窃听,保证数据安全。其他改进包括:阅读和发送国际邮件(支持Unicode)、地址簿同步、通过安全套接层(SSL)协议收发邮件、收取邮箱邮件;提高收发Hotmail、MSN电子邮件速度支持名片(vCard)、以嵌入方式显示附件图片、增强本地邮箱邮件搜索功能等等[6]。1.3系统概述一般的客户端电子邮件软件应该有以下的功能:1)编辑邮件(用户进行邮件编辑)2)读邮件(用户在收件箱、发件箱、草稿箱和垃圾箱中查阅邮件信息)3)发送邮件(发送已编辑的邮件或回复接收邮件)4)接收邮件(接收发送方的邮件)5)添加联系人(向通信录添加联系人信息)6)编辑联系人(编辑通信录中联系人的信息)7)删除联系人(删除通信录中联系人信息)1.4本文工作本文在深入了解电子邮件管理的实际操作流程的基础上,总结生活中常用的电子邮件功能,采用面向对象的编程思想设计并开发一套简单、方便的客户端电子邮件软件,实现对电子邮件灵活的管理。2开发环境的搭建2.1运行平台2.1.1硬件平台CPU:P41.8GHZ。内存:256MB以上。2.1.2软件平台操作系统:Windows2003。C++程序开发工具:VISUALC++6.0分辨率:推荐使用1024×768像素。2.2运行环境的配置2.2.1POP3和STMP简介(1)POP3概述POP3是PostOfficeProtocol3的简称,即邮局协议第3版。它规定了怎样将个人计算机连接到Internet的邮件服务器和如何下载电子邮件。它是Internet电子邮件的第一个离线协议标准。简单地说,POP3就是一个简单而使用的邮件信息传输协议。(2)SMTP概述SMTP是SimpleMailTransferProtocol的简称,即简单邮件传输协议。SMTP是一种提供可靠且有效电子邮件传输的协议。它是一组用于由源地址到目的地址发送邮件的规则,用来控制信件的中转方式。它帮助每台计算机在发送或中转信件时找到下一个目的地,通过SMTP协议所指定的服务器,将邮件发送到收件人的服务器上。2.2.2安装POP3/SMTP服务在Windows2003下架设邮件服务器可以用系统自带的POP3及SMTP服务建立。同其他服务一样,默认情况下这两个服务是没有安装的,需要手工进行添加。安装的步骤如下:第一步:安装POP3服务组件。以系统管理员身份登录Windows2003系统,选择【控制面板】|【添加或删除程序】|【添加/删除Windows组件】命令,在弹出的【Windows组件向导】对话框中选中【电子邮件服务】选项。单击【详细信息】按钮,可以看到该选项包括两部分内容,分别是“POP3服务”和“POP3服务Web管理”。为方便用户以远程Web方式管理邮件服务器,建议选中【POP3服务Web管理】命令,如图2.1所示。图2.1选中【POP3服务Web管理】第二步:安装SMTP服务组件。选中【应用程序服务器】选项,单击【详细信息】按钮。在【Internet信息服务(IIS)】选项中查看详细信息,选中SMTPService选项,单击【确定】按钮。此外,如果需要对邮件服务器进行远程Web管理,一定要选中【万维网服务】选项中的【远程管理(HTML)】命令组件。完成以上设置后,单击【下一步】按钮,系统就开始安装配置POP3和SMTP服务了。2.2.3配置POP3/SMTP服务配置POP3/SMTP服务器步骤如下:第一步:创建邮件域。选择【开始】|【管理工具】|【POP3服务】命令,弹出【POP3服务控制台】对话框。选中左栏中的POP3服务后,单击右栏中的【新域】选项,弹出【添加域】对话框。在【域名】文本框中输入邮件服务器的域名,也就是邮件地址“@”后面的部分,例如,然后单击【确定】按钮,如图2.2所示。图2.2

创建新域第二步:创建系统登陆帐户。选中新建的域,在右栏中选择【添加邮箱】命令,弹出【添加邮箱】对话框,在【邮箱名】文本栏中输入邮件用户名,然后设置用户密码,最后单击【确定】按钮,完成系统登陆帐户的创建,如图2.3所示。图2.3

创建邮箱第三步:配置SMTP服务器。选择【开始】|【程序】|【管理工具】|【Internet信息服务管理器】选项。在【IIS管理器】对话框中右击【默认SMTP虚拟服务器】选项,在弹出的菜单中选择【属性】选项,进入【默认SMTP虚拟服务器属性】对话框,切换到【常规】选项卡,在【IP地址】下拉列表框中选择邮件服务器的IP地址即可。单击【确定】按钮,这样一个简单的邮件服务器就架设完成了,如图2.4所示。完成以上设置后,就可以使用邮件客户端软件连接邮件服务器进行邮件收发工作。只要在POP3和SMTP处输入邮件服务器的IP地址即可。注意:这个时候smtpaccess里面设置的是匿名访问,此时任何用户都可以利用此mail服务器发邮件。图2.4

设置SMTP虚拟服务器属性第四步:设置在SMTP虚拟服务器中传入邮件信息的存放位置。SMTP虚拟服务器有一个本地默认域,默认指定的传入邮件信息都放置在C:\Inetpub\mailroot\Drop文件夹中,可以根据实际情况更改Drop文件夹的位置,如图2.5。图2.5:设置传入邮件信息的存放位置2.2.4Jmail组件的注册Jmail组件是一个功能强大的邮件发送组件,使用该组件可以方便地实现邮件的发送和接收功能,而且Jmail组件具有通用性,很多语言都可以使用。但是在使用之前,首先要注册该组件。注册步骤如下:第一步:从网络上下载的Jmail.dll文件。第二步:把Jmail.dll文件文件复制到C:\WINDOWS\system32\目录下。第三步:运行注册命令。在【运行】中输入regsvr32C:\WINDOWS\system32\Jmail.dll语句,单击确定按钮,当出现如图2.6所示的提示对话框,则完成该组件的注册。图2.6Jmail.dll注册成功3系统概要设计3.1设计目标(1)系统架构清晰、界面友好美观、操作简便、实用性强;(2)提供灵活、方便、快捷、准确的电子邮件管理;3.2功能模块分析根据系统的用例图和需求分析,可以把系统划分为以下几个功能模块:登陆模块:通过电子邮箱帐户和密码进行身份验证,正确输入电子邮箱帐户和密码后,进入系统主界面进行操作。主界面模块:整个软件的导航模块,可以单击该界面左侧的按钮进入相应的信箱。在该界面右侧显示了各个界面的邮件信息,包括邮件总数和新邮件数。写邮件模块:用户可以进行邮件编辑、发送,单击“选择收件人”按扭,可以向收件人文本框中插入地址;通过“添加邮件”和“删除邮件”按扭来设置是否发送附件;编辑好的邮件,单击工具栏中的“发送”按扭,可以发送邮件。读邮件模块:用户在收件箱、发件箱、草稿箱和垃圾箱中按下工具栏中的“查看”按钮后,会打开读邮件模块,用户可以查看当前选择的邮件信息,并且根据需要进行回复或转发操作。发信箱模块:保存用户已发送的邮件。用户可以在发信箱中查看邮件信息,并可以进行再发送。在工具栏设有查看按钮,删除按钮,清空按钮和排序按钮。用户可以在工具栏选择“排序”下拉按钮的菜单项选择排序字段。用户单击“查看”,可以查看当前选择的电子邮件。草稿箱模块:主要用来保存用户编辑好但没有发送的邮件。用户可以在草稿箱中查看邮件信息,并可以进行发送。在工具栏设有查看按钮,删除按钮,清空按钮和排序按钮。用户可以在工具栏选择“排序”下拉按钮的菜单项选择排序字段。用户单击“查看”,可以查看当前选择的电子邮件。垃圾箱模块:主要用来保存从收件箱中删除的邮件,用户可以在垃圾箱中查看邮件信息,并可以进行发送。在工具栏设有查看按钮,删除按钮,清空按钮,排序按钮和分类按钮。用户可以在工具栏选择“排序”下拉按钮的菜单项选择排序字段,也可以通过“分类”按钮根据主题筛选邮件。用户单击“查看”,可以查看当前选择的电子邮件。收件箱模块:主要用来管理用户接收到的电子邮件。在工具栏设有查看按钮,刷新按钮,删除按钮,清空按钮,排序按钮和分类按钮。用户可以在工具栏选择“排序”下拉按钮的菜单项选择排序字段,也可以通过“分类”按钮根据主题筛选邮件。用户单击工具栏上的“刷新”按钮,获取新的邮件信息,并写入数据库中。用户单击“查看”,可以查看当前选择的电子邮件。通信录模块:用于管理用户的常用联系人。用户可以设置一些分组,然后将常用联系人添加到分组中,这样在查找联系人时就可以根据分组进行快速查找了。系统的功能模块图如下:发送邮件客户端电子邮件软件发送邮件客户端电子邮件软件垃圾箱草稿箱写邮件发件箱存入草稿箱选择联系人添加附件删除附件查看邮件删除邮件清空发件箱邮件箱排序查看邮件删除邮件清空草稿箱邮件箱排序查看邮件删除邮件清空垃圾箱邮件箱排序邮件分类收件箱查看邮件接收新邮件删除邮件情况收件箱邮件排序邮件分类读邮件回复邮件转发邮件保存联系人另存为附件通信录添加邮件添加联系人编辑联系人删除联系人分组查看图3.2系统功能模块图4系统详细设计4.1重点模块的详细设计4.1.1主界面模块的详细设计本模块的界面是1个基于对话框资源。在该对话框中添加控件,包括6个图片控件和9个按钮控件,并向工程导入8个位图资源,修改其位图ID。控件的属性如表1。表1主界面控件设置表控件ID控件属性关联变量IDC_STATICRECEIVEtype:Bitmap、Image:IDB_RECEIVE无IDC_STATICSENDtype:Bitmap、Image:IDB__STATICSEND无IDC_STATICDRAFTtype:Bitmap、Image:IDB__STATICDRAFT无IDC_STATICLITTERtype:Bitmap、Image:IDB__STATICLITTER无IDC_STATICADDRESStype:Bitmap、Image:IDB__STATICADDRESS无IDC_FRAMEtype:Frame、Color:BlackCbuttonHotm_ReceiveIDC_BUTRECEIVE勾选OwenrdrawCstacticm_FrameIDC_BUTWRITE勾选OwenrdrawCbuttonHotm_WriteIDC_RECEIVEBOX勾选OwenrdrawCbuttonHotm_ReceiveboxIDC_SENDBOX勾选OwenrdrawCbuttonHotm_SendboxIDC_DRAFTBOX勾选OwenrdrawCbuttonHotm_DraftboxIDC_LITTERBOX勾选OwenrdrawCbuttonHotm_LitterboxIDC_CONTACT勾选OwenrdrawCbuttonHotm_ContactIDC_BUTMIN勾选BitmapCbuttonm_MinIDC_BUTCLOSE勾选BitmapCbuttonm_Close本模块的主要任务是当用户登录后,提供不同按钮进入不同的功能模块实现具体的操作,并在信息区域显示当前登陆的邮箱内邮件及新邮件的数量。主界面通过在头文件声明各个子窗体的指针与其他的模块建立连接,这些指针包括CMailCountDlg*MailCountDlg;//邮件统计窗体、CReceiveBoxDlg*ReceiveBoxDlg;//收件箱、CSendBoxDlg*SendBoxDlg;//发件箱、CDraftBoxDlg*DraftBoxDlg;//草稿箱、CLitterBoxDlg*LitterBoxDlg;//垃圾箱、CWriteMailDlg*WriteMailDlg;//写邮件、CReadMailDlg*ReadMailDlg;//读邮件、CAddressDlg*AddressDlg;//通信录、CStatusBarm_StatusBar;//状态栏。主界面的下方设置有状态栏,显示当前登陆的邮箱及当前的日期和时间,为用户在编辑邮件时提供一些简要的信息。主界面的右上方设置了最小化按钮和关闭按钮,用户能通过主界面的这些按钮退出或将程序最小化。创建状态栏和设置最小化按钮和关闭按钮的显示图片,均在主界面的OnInitDialog方法中完成。其中,主界面的OnCtlColor函数,处理WM_CTLCOLOR消息,用于绘制背景;OnButmin函数处理WM_SYSCOMMAND消息,用于处理“最小化”按钮的单击事件。当用户点击主界面中的功能按钮进入相应的模块时,原来用于显示邮件及新邮件数量等的信息区域,会相应地改变。用户能通过该区域的变化,直观地判断当前系统所处的模块。在主界面对话框中,添加CreateDialogBox函数用于创建用户要打开的子窗体,添加DestroyWindowBox函数用于销毁当前打开的子窗口,此外在主界面的PreTranslateMessage虚方法中,屏蔽<ESC>键关闭窗体的功能,并设置无标题窗体的拖动,从而实现信息区域的变化。本系统的按钮具有热点效果,实现步骤如下:(1)以CButton类为基类,派生一个CbuttonHot类(2)重载DrawItem方法,在该方法中绘制按钮控件代码如下:CDCdc;//通过创建一个CDC类的对象,声明设备上下文 dc.Attach(lpDrawItemStruct->hDC);//获得绘制按钮设备上下文 UINTstate=lpDrawItemStruct->itemState;//获取状态 CRectrect; //声明区域对象 GetClientRect(rect);//获得编辑框客户区域 CStringtext; GetWindowText(text);//获得按钮文本 if(state&ODS_DISABLED)//如果按钮不可用 { dc.SetBkMode(TRANSPARENT);//设置背景透明 dc.SetTextColor(RGB(0,0,0));//设置文本颜色 dc.DrawText(text,&rect,DT_CENTER);//绘制文本 } elseif(m_IsInRect==TRUE)//如果鼠标在按钮上 { dc.SetBkMode(TRANSPARENT);//设置背景颜色 dc.SetTextColor(RGB(255,0,0));//设置文本颜色 dc.DrawText(text,&rect,DT_CENTER);//绘制文本 } else//默认情况下 { dc.SetBkMode(TRANSPARENT);//设置背景透明 dc.SetTextColor(RGB(0,0,0));//设置文本颜色 dc.DrawText(text,&rect,DT_CENTER);//绘制文本 }(3)重载PreSubclassWindow方法,在该方法中设置定时器代码如下:SetTimer(1,10,NULL);//设置定时器CButton::PreSubclassWindow();(4)在CbuttonHot类的OnTimer方法中,设置在定时器中判断鼠标是否移动到按钮上代码如下:CPointpoint;//声明Cpoint变量 GetCursorPos(&point);//获得鼠标位置 CRectrcWnd;//声明区域对象 GetWindowRect(&rcWnd);//获得按钮区域 if(rcWnd.PtInRect(point))//判断鼠标是否在按钮上 { if(m_IsInRect==TRUE)//判断鼠标是否一直在按钮上 gotoEND;//跳转到标记 else//鼠标移动到按钮上 { m_IsInRect=TRUE;//设置m_IsInRect变量值 Invalidate();//重绘按钮 } } else//不在按钮区域内 { if(m_IsInRect==FALSE)//判断鼠标一直在按钮外 gotoEND;//跳转到标记 else//鼠标移动到按钮外 { Invalidate();//重绘按钮 m_IsInRect=FALSE;//设置m_IsInRect变量值 } }END: CButton::OnTimer(nIDEvent); //设置标记,调用基类方法4.2.2写邮件模块的详细设计本模块的界面是1个基于对话框资源。在该对话框中添加控件,包括4个文本框控件、1个列表控件和3个按钮控件。控件的属性设置如表2。表2写邮件界面控件设置表控件ID控件属性关联变量IDC_EDIT1勾选Read-onlyCstingm_SendManIDC_EDIT2无Cstingm_ReceiveManIDC_EDIT3无Cstingm_MotifIDC_EDIT4Multiline、Verticalscoll、AutoVscroll、WantreturnCstingm_TextIDC_LIST1勾选VerticalscrollClistBoxm_AnnexIDC_BUTSELECT勾选OwenrdrawCbuttonHotm_SelectIDC_BUTADD勾选OwenrdrawCbuttonHotm_AddIDC_BUTDEL勾选OwenrdrawCbuttonHotm_Del本模块的任务是让用户点击“写信”功能按钮后进入写邮件模块,用户可以在该模块内编辑邮件,并根据工具栏的按钮进行发送、存草稿、取消等操作。在邮件编辑时,写邮件模块所提供的“选择收件人”按键,由对话框的OnButselect方法处理该按键的单击事件,当按钮按下后弹出“联系人列表”对话框,在“联系人列表”对话框中可以通过条件查询,将查询结构插入到写邮件模块的“收件人”文本框中。对话框的OnButadd方法处理“添加附件”按钮的单击事件,当按钮按下后弹出“附件列表”对话框,用户在“附件列表”对话框中选择附件的路径。对话框的OnButdel方法处理“删除附件”按钮的单击事件,用户附件文本框中,选择需要删除的附件,单击"删除附件"按钮即可删除选中的附件。写邮件模块中所设置的工具栏提供“发送”、“存草稿”和“取消”按钮。用户在编辑邮件后,选择所需的工具栏按钮执行相应的操作。工具栏在对话框的OnInitDialog方法中创建。写邮件对话框的OnSend方法处理工具栏“发送”按钮的单击事件,该事件调用线程函数发送邮件,并将发送的邮件信息写入到发件箱,前提在主界面的.CPP文件中声明MAPI函数原型,并定义线程函数ThreadProc,在该线程函数中执行MAPI函数的代码,实现发送邮件的功能,执行该线程函数后会返回一个执行成功或执行失败的值,用来判读邮件是否发送成功。写邮件对话框的OnSave方法处理工具栏中“存草稿”按钮的单击事件,当按钮按下后将当前编辑的邮件信息保存到草稿箱中。对话框的OnCan方法处理工具栏中“取消”按钮的单击事件,当按钮按下后清空当前编辑的邮件信息。线程函数ThreadProc的说明如下:线程函数ThreadProc,是一个应用程序定义的函数,可作为起始地址的线程。指定这个地址时,调用CreateThread或CreateRemoteThread功能。ThreadProc是一个占位符的应用定义的函数名称。线程函数ThreadProc的函数原型如下:DWORDWINAPIThreadProc(LPVOIDlpParameter//线程数据);其中参数lpParameter用于接收CreateThread或CreateRemoteThread功能传递给函数的线程数据。执行线程函数ThreadProc后,将返回一个布尔型的值表明函数执行是否成功。系统依靠该返回值,判断提示消息“发送成功”或“操作失败”。4.2.3草稿箱模块的详细设计本模块界面的是1个基于对话框资源。在该对话框中添加控件,包括1个文本框控件、1个列表视图控件、32个复选框控件和5个按钮控件。控件的属性设置如表3。表3草稿箱界面控件设置表控件ID控件属性关联变量IDC_EDIT1无intm_PageIDC_LIST1View:Report勾选NosortheaderClistCtrlm_GridIDC_CURRENTLY勾选Owenrdraw、DisabledCbuttonHotm_CurrentlyIDC_BUTPEVIOUS勾选OwenrdrawCbuttonHotm_PreviousIDC_BUTNEXT勾选OwenrdrawCbuttonHotm_NextIDC_SUM勾选Owenrdraw、DisabledCbuttonHotm_SumIDC_BUTGO勾选OwenrdrawCbuttonHotm_Go本模块的任务是管理用户在写邮件模块中单击“存草稿”按钮后所保存的邮件。本模块需要在头文件中声明以下的变量,包括:CToolBarm_ToolBar;//工具栏对象、CReBarm_Rebar;//Rebar条,这两个变量用于创建带背景的工具栏。还有CCustomMenum_MenuOrder;//排序菜单、CStringm_Sql;//记录查询语句、intm_Num;//记录分页码、Cstringm_SortField;//记录排序字段,这三个变量用于排序下拉按钮。本模块在工具栏中提供了“查看”按钮、“删除”按钮、“清空”按钮和“排序”按钮。用户在邮件的列表视图中选择所需的邮件,通过工具栏选择功能按钮执行相应的操作。工具栏在对话框的OnInitDialog方法中创建,并设置工具栏下拉按钮,设置列表视图控件的扩展风,向列表中插入数据,和计算分页的页码。工具栏中“查看”按钮的单击事件由对话框的中OnLook方法处理,单击“查看”按钮,弹出写邮件模块,在写邮件模块中显示当前邮件的具体信息。工具栏中“删除”按钮的单击事件由对话框的OnDelete方法处理,当用户在邮件列表图中选定需要删除的邮件,单击“删除”按钮即可。工具栏中“清除”按钮的单击事件由对话框的OnClear方法处理,单击“清除”按钮将删除草稿箱内所有的邮件。工具栏中的“排序”按钮是下拉式按钮,下拉后分别有“按邮箱”、“按主题”和“按时间”的选项。“按邮箱”排序的单击事件由对话框的中OnMenureceive方法处理,该事件中根据收件人信息来排列邮件。“按主题”排序的单击事件由对话框的中OnMenumotif方法处理,该事件中根据邮件的主题信息来排列邮件。“按时间”排序的单击事件由对话框的中OnMenutime方法处理,该事件中根据邮件的修改时间信息来排列邮件。此外对话框还要添加AddToGrid函数,将符合条件的邮件记录都插入到列表中。邮件的列表视图设有“上一页”、“下一页”和“GO”按钮,用户能通过这些按钮查看列表中的所有邮件。“GO”按钮的单击事件由对话框的中OnButgo方法处理,当用户在文本框中输入要跳转的页码后,单击GO按钮,邮件列表视图跳到文本框中输入页。“上一页”按钮的单击事件由对话框的中OnButprevious方法处理,如果当前邮件列表图为非第一页,单击“上一页”按钮,邮件列表视图将转到当前页的前一页。“下一页”按钮的单击事件由对话框的中OnButnext方法处理,如果当前邮件列表图为非最后以页,单击“下一页”按钮,邮件列表视图将转到当前页的后一页。收件箱模块的详细设计本模块的是1个基于对话框资源。在该对话框中添加控件,包括1个文本框控件、1个列表视图控件、31个复选框控件和5个按钮控件。控件的属性设置如表4。表4收件箱界面控件设置表控件ID控件属性关联变量IDC_EDIT1无intm_PageIDC_LIST1无View:Report勾选NosortheaderClistCtrlm_GridIDC_CURRENTLY勾选Owenrdraw、DisabledCbuttonHotm_CurrentlyIDC_BUTPEVIOUS勾选OwenrdrawCbuttonHotm_PreviousIDC_BUTNEXT勾选OwenrdrawCbuttonHotm_NextIDC_SUM勾选Owenrdraw、DisabledCbuttonHotm_SumIDC_BUTGO勾选OwenrdrawCbuttonHotm_Go本模块的任务管理用户接收到的电子邮件。本模块在工具栏中提供了“查看”按钮、“删除”按钮、“清空”按钮、“排序”按钮和“分类”按钮,和草稿箱模块的工具栏相比增加了“分类”按钮和“刷新”按钮。用户在登陆邮件箱前,系统提供了“添加分类”按钮。默认的情况下,系统提供了文件和邮件两个分类,用户也可以根据自己的需要增加分类标识。分类主要是对接收到的邮件进行分类管理。要想对邮件进行分类,必须让发送者了解您的分类格式,当对方给您发送邮件时,在主题后面加上“TO:”+分类名称即可,例如:“TO:文件”,则接收邮件后程序自动将该封邮件分到“文件”类中,当选择“分类”菜单中的“文件”时,自动会显示在邮件列表视图中。本模块的工具栏在对话框的OnInitDialog方法中创建,并设置工具栏下拉按钮,设置列表视图控件的扩展风,向列表中插入数据,和计算分页的页码。工具栏中“刷新”按钮的单击事件由对话框的OnRefurbish方法处理,当用户按下“刷新”按钮后,将读取新邮件信息,并将新邮件标记为未读邮件。此外添加AddToGrid函数,将数据库中已收到的邮件信息添加到收件箱列表中,并判断是否为未读邮件,如果是未读邮件,则在发件人后追加“(未读)”标记。IsReceiveMail函数,用于判断是否为新邮件。IsReceiveMail函数的代码如下:BOOLCReceiveBoxDlg::IsReceiveMail(CStringsql){BOOLresult;ADOm_Ado;m_Ado.OnInitADOConn();//连接数据库m_Ado.m_pRecordset=m_Ado.OpenRecordset(sql);//打开记录集if(!m_Ado.m_pRecordset->adoEOF)//如果是新邮件 result=FALSE;//设置返回值FALSE}else//邮件不存在 result=TRUE;//设置返回值TRUEm_Ado.CloseRecordset();//关闭记录集m_Ado.CloseConn();//断开数据库连接returnresult;}4.2.5读邮件模块的详细设计本模块的界面是1个基于对话框资源。在该对话框中添加控件,包括5个文本框控件、1个列表视图控件、2个按钮控件。控件的属性设置如表5。表5读邮件界面控件设置表控件ID控件属性关联变量IDC_EDIT1无Cstingm_SendManIDC_EDIT2无Cstingm_MotifIDC_EDIT3勾选Read-onlyCstingm_ReceiveManIDC_EDIT4勾选Read-onlyCstingm_RtimeIDC_EDIT5Multiline、Verticalscoll、AutoVscroll、WantreturnCstingm_TextIDC_LIST1勾选VerticalscrollClistBoxm_AnnexIDC_LINKMAN勾选OwenrdrawCbuttonHotm_LinkmanIDC_BUTSAVE勾选OwenrdrawCbuttonHotm_Save本模块的任务是查看用户在收收件箱和垃圾箱选定并单击“查看”按钮的邮件信息并且根据需要进行回复或转发操作。本模块在工具栏中提供了“回复”按钮、“转发”按钮。本模块的工具栏在对话框的OnInitDialog方法中创建。工具栏中“回复”按钮的单击事件由对话框的中OnRestore方法处理,当用户选择回复邮件时,将打开写邮件模块,并将当前邮件的发件人写入到收件人文本框中。工具栏中“转发”按钮的单击事件由对话框的中OnTransmit方法处理,当用户选择转发邮件时,将打开写邮件模块,并将当前邮件的信息写入到相应的位置。在本模块中,阅读邮件信息时提供了“保存联系人”按钮和“另存为附件”按钮。其中“保存联系人”按钮的单击事件由对话框的中OnLinkman方法处理,当用户单击该按钮,系统会保存发件人的信息到通信录模块。工具栏中“附件另存为”按钮的单击事件由对话框的中OnButsave方法处理,当用户按下此按钮后,弹出“另存为”对话框,在用户选择存储附件的路径后保存附件。4.2.6通信录模块的详细设计本模块的任务是管理用户的常用联系人,该模块工具栏中的“添加”按钮通过通信录的两个子窗体“添加分组”窗体和“添加联系人”窗体的组合实现的添加联系人的功能。添加联系人窗体界面是1个基于对话框资源。在该对话框中添加控件,包括4个文本框控件、1个组合框控件和4个按钮控件。控件的属性设置如表6。表6通讯录界面控件设置表控件ID控件属性关联变量IDC_EDIT1无Cstingm_ManIDC_EDIT2无Cstingm_MailIDC_EDIT3无Cstingm_PhoneIDC_EDIT4无Cstingm_AddressIDC_COMBO1无CbuttonBoxm_ComboIDC_LINKMAN勾选Owenrdraw、DissabledCbuttonHotm_LinkmanIDC_BUTGROUP勾选OwenrdrawClistBoxm_Group添加联系人窗体必须在头文件中声明所需变量,分别是m_Name:窗体标题和m_IsAdd:添加标记。在窗体的OnInitDialog方法中判断当前添加联系人还编辑联系人,从而设置窗体标题。添加AddToCombo函数,用于将数据库中的联系人分组数据插入到分组组合框中。在窗体的OnButgroup中,设置“添加分组”按钮的单击事件,在该函数中调用“添加分组”窗体添加新的分组,并将新的分组插入到组合框中。在窗体的OnButok中,设置“确定”按钮的单击事件,在该函数中将用户设置的联系人信息保存到数据库中。添加分组窗体界面是1个基于对话框资源。在该对话框中添加控件1个文本框控件、1个列表视图控件、2个静态文本控件和2个按钮控件。控件的属性设置如表7。表7分组窗体界面控件设置表控件ID控件属性关联变量IDC_LIST1无View:SmallIconClistCtrlm_GridIDC_EDIT1无CEditm_NameIDC_BUTOK勾选OwenrdrawCbuttonHotm_OKIDC_BUTCANCLE勾选OwenrdrawCbuttonHotm_Cancle添加联系人窗体在OnInitDialog方法中创建图像列表,并使用图像列表控件关联图像列表。在该窗体的OnButok方法中,设置“确定”按钮的单击事件,在该事件的处理函数中将用户设置的分组名称插入到数据库中。本模块中的工具栏除了提供“添加”按钮外,还有“编辑”按钮、“删除”按钮和“分组”按钮,其中分组按钮是根据“添加分组窗体”提供的信息来排列联系人列表,默认的情况下通过“同事”和“朋友”的分组。当用户单击“编辑”按钮后,弹出编辑对话框,用户在该对话框内修改联系人的信息。4.2.7本系统使用MAPI函数发送电子邮件,实现的步骤如下:(1)声明MAPI函数原型在主面界窗体的头文件引入mapi.头文件,然后在主面界窗体声明MAPI函数原型。在主界面源文件中声明MAPI函数原型。代码如下:ULONG(PASCAL*lpfnMAPISendMail)(LHANDLElhSession,ULONGulUIParam,lpMapiMessagelpMessage,FLAGSflFlags,ULONGulReserved);ULONG(FARPASCAL*lpfnMAPILogon)(ULONGulUIParam,LPSTRlpszProfileName,LPSTRlpszPassword,FLAGSflFlags,ULONGulReserved,LPLHANDLElplhSession);ULONG(FARPASCAL*lpfnMAPILogoff)(LHANDLElhSession,ULONGulUIParam,FLAGSflFlags,ULONGulReserved);ULONG(FARPASCAL*lpfnMAPIFreeBuffer)(LPVOIDlpBuffer);(2)使用MAPI发送邮件使用MAPI发送邮件时,首先在主界面对话框的线程函数ThreadProc装载MAPI32.DLL动态链接库,用lpfnMAPILogon函数开启一个对话,然后设置MapiMessage结构指针,通过MapiMessage结构指针设置发送邮件信息,然后调用lpfnMAPISendMail函数发送邮件。在发送前需要定义一个MapFileDesc结构数组。该数组用来保存附件信息,数组中的每一个元素都对应一个附件信息。在设置MapFileDesc结构时,将MapFileDesc结构数组赋值给MapiMessage结构的lpFile成员。代码如下:HMODULEresult=LoadLibrary("mapi32.dll");//加载动态库/////////////////////////获取函数指针(FARPROC&)lpfnMAPILogon=GetProcAddress(result,"MAPILogon");(FARPROC&)lpfnMAPISendMail=GetProcAddress(result,"MAPISendMail");(FARPROC&)lpfnMAPIFreeBuffer=GetProcAddress(result,"MAPIFreeBuffer"); (FARPROC&)lpfnMAPILogoff=GetProcAddress(result,"MAPILogoff"); unsignedlonga;/////////////////////开始一个会话 lpfnMAPILogon(0,NULL,NULL,0,0,&a); ULONGlresult; CTimetime=CTime::GetCurrentTime();//获取当前时间////////////////////格式化时间YYYY/MM/DDHH:MM CStringctime=time.Format("%Y//%m//%d%H:%M"); chardate[50]; strcpy(date,ctime); CStringreceiveman=ReMail; intnum=ReMail.Find(';'); intreceivenum=0; while(num!=-1) { receivenum++; num=ReMail.Find(';',num+1); } receivenum++; CString*addr1=newCString[receivenum];//记录用户账户 CString*addr2=newCString[receivenum];//记录SMTP服务器 MapiRecipDesc*m_receiver=newMapiRecipDesc[receivenum]; for(intn=0;n<receivenum;n++) { CStringreceiver,man;/////////////////////////////////获取用户账户 receiver=receiveman.Left(receiveman.Find('@')); intmanindex=receiveman.Find(';'); if(manindex==-1) man=receiveman; else man=receiveman.Left(manindex); receiveman=receiveman.Right(receiveman.GetLength()-manindex-1); addr1[n]=receiver; receiver="SMTP:"+man; addr2[n]=receiver; m_receiver[n].ulReserved=0; m_receiver[n].ulRecipClass=MAPI_TO; m_receiver[n].lpszName=addr1[n].GetBuffer(0); m_receiver[n].lpszAddress=addr2[n].GetBuffer(0); m_receiver[n].ulEIDSize=0; m_receiver[n].lpEntryID=NULL;//定义接收者信息 } MapiMessage*m_messageInfo;//定义一个信息结构指针 m_messageInfo=newMapiMessage;//////////////////////初始化m_messageInfo memset(m_messageInfo,0,sizeof(MapiMessage)); m_messageInfo->lpszNoteText=TextMail.GetBuffer(0);//设置邮件正文 m_messageInfo->ulReserved=0; //保留,必须为0 m_messageInfo->lpszSubject=MotifMail.GetBuffer(0); //设置主题 m_messageInfo->lpszDateReceived=date; //设置邮件发送时间 m_messageInfo->lpszConversationID=NULL;//邮件所属线程一个字符串指针 m_messageInfo->flFlags=MAPI_SENT;//邮件状态标记 m_messageInfo->lpOriginator=NULL;//发送者信息 m_messageInfo->nRecipCount=receivenum;//接收者人数 m_messageInfo->lpRecips=m_receiver;//设置接收者信息 m_messageInfo->lpszMessageType=NULL; //邮件类型 m_messageInfo->nFileCount=filenum;//附件数////////////////////////////////////MapiFileDesc结构数组MapiFileDesc*m_mapifiledesc=newMapiFileDesc[filenum]; CStringpathfile,annex; annex=AnnexMail; CString*path=newCString[filenum]; CString*file=newCString[filenum]; for(inti=0;i<filenum;i++) { m_mapifiledesc[i].ulReserved=0;//保留,必须为0 m_mapifiledesc[i].flFlags=0;//附件标记 m_mapifiledesc[i].nPosition=TextMail.GetLength()-1; intindex=annex.Find(';'); if(index==-1) pathfile=annex; else { pathfile=annex.Left(index); annex=annex.Right(annex.GetLength()-index-1); } intpos=pathfile.ReverseFind('\\'); path[i]=pathfile; file[i]=pathfile.Right(pathfile.GetLength()-pos-1); m_mapifiledesc[i].lpszPathName=path[i].GetBuffer(0); m_mapifiledesc[i].lpszFileName=file[i].GetBuffer(0); m_mapifiledesc[i].lpFileType=NULL; } m_messageInfo->lpFiles=m_mapifiledesc;//附件数 lresult=lpfnMAPISendMail(a,0,m_messageInfo,0,0);//发送邮件 if(lresult!=SUCCESS_SUCCESS)//判断邮件是否发送成功 { AfxMessageBox("操作失败.",64); } else { AfxMessageBox("邮件发送成功.",64); } delete[]addr1; delete[]addr2; delete[]path; delete[]file; delete[]m_receiver; delete[]m_messageInfo; delete[]m_mapifiledesc; lpfnMAPIFreeBuffer(m_messageInfo); lpfnMAPILogoff(a,0,0,0); FreeLibrary(result);4.2.8使用Jmail本系统通过Jmail组件实现邮件的接收。邮件的接收需要通过Jmail组件中的IPOP3Ptr指针和IPOP3Ptr指针对象的Message指针完成。IPOP3Ptr指针负责与邮件服务器的连接,建立连接后可以通过IPOP3Ptr指针对象的Message指针来获得邮件的具体内容。IPOP3Ptr指针的Connect函数实现与邮件服务器的连接,Connect函数的参数包括Username、Password、Server、Port,分别是登陆的用户名、登陆密码、POP服务器、服务器端口。Message指针的Count属性能获得邮件的数量,Message指针的Item属性就是邮件文件。实现的步骤如下:(1)在StdAfx.h文件中引用Jmail组件,并使用命名空间。代码如下:#import"jmail.dll"usingnamespacejmail;(2)在收件箱对话框的OnRefurbish方法,使用Jmail组件实现接收电子邮件。代码如下:CStringstrpop=ServerMail;//服务器CStringstrusr=UserMail;//用户名CStringstrpwd=PwdMail;//密码CStringsql;jmail::IPOP3Ptrjpop;//IPOP3Ptr指针jpop.CreateInstance(__uuidof(jmail::POP3));//创建对象实例try { jpop->Timeout=120;jpop->Connect((_bstr_t)strusr,(_bstr_t)strpwd,(_bstr_t)strpop,110);//连接服务器 longmailcount=jpop->Messages->Count; for(inti=1;i<mailcount;i++) {CStringfrom=(char*)jpop->Messages->Item[i]->From;//发件人CStringrecipients=(char*)jpop->Messages->Item[i]->GetRecipientsString();//收件人CStringbssubject=(char*)jpop->Messages->Item[i]->Subject;//主题CStringsort;CStringmailuid=(char*)jpop->GetMessageUID(i);//邮件UIDintindex=bssubject.Find("TO:");if(index!=-1) sort=bssubject.Right(bssubject.GetLength()-index-3);else sort="其他";CStringbsbody=(char*)jpop->Messages->Item[i]->Body;//邮件内容COleDateTimetime=jpop->Messages->Item[i]->Date;//接收时间longcount=jpop->Messages->Item[i]->GetAttachments()->GetCount();//附件数量CStringAttachments=""; for(intj=0;j<count;j++) { Attachments=(char*)jpop->Messages->Item[i]->GetAttachments()->GetItem(j)->GetName();//附件名 sql.Format("select*fromtb_receiveboxwhere邮件UID='%s'and邮箱用户='%s'",mailuid,UserMail); if(IsReceiveMail(sql))//判断是否为新邮件 { CStringfilepath; filepath=path; filepath+="\\附件\\"; filepath+=mailuid; filepath+=Attachments; jpop->Messages->Item[i]->GetAttachments()->GetItem(j)-> SaveToFile((_bstr_t)filepath);//存储附件 } }}}5测试分析本文对系统的登陆模块及主界面、写信模块、收件箱模块、草稿箱模块、垃圾箱模块及通信录模块都进行测试。登陆模块、主界面模块和添加分类模块测试运行程序,打开程序登录界面,如图6.1所示。输入服务器名称、邮箱及邮箱密码,单击“登录”按钮,即可进入程序主界面,如图1.2所示。在主界面中显示了各个信箱中的邮件信息,包括邮件总数和新邮件数,单击左侧的按钮可进入相应的信箱。图6.1:登录界面图6.2:主界面单击登录界面中的“添加分类”按钮,进入添加邮件分类模块,如图6.3所示。输入菜单名称,菜单标识自动增加,然后单击“确定”按钮即可。菜单分类主要是对接收到的邮件进行分类管理。要想对邮件进行分类,必须让发送者了解您的分类格式,当对方给您发送邮件时,在主题后面加上“TO:”+分类名称即可,例如:“TO:文件”,则接收邮件后程序自动将该封邮件分到“文件”类中,当选择“分类”菜单中的“文件”时,自动会显示在列表中,如图6.4所示。图6.3:“添加分类”按钮图6.4:“分类”菜单写信模块单击“写信”按钮,进入写信页面,如图6.5所示。输入收件人邮箱地址,也可以单击“选择联系人”按钮选择联系人,通过“添加附件”和“删除附件”按钮可设置发送附件,单击“发送”按钮即可发送邮件。邮件发送成功后,在发件箱中将会记录。图6.5:写信页面收件箱模块单击“收件箱”导航按钮,进入收件箱页面,如图6.6所示。单击“刷新”按钮可接收新邮件,勾选邮件前的复选框,单击“查看”按钮,可查看该邮件内容。图6.6:收件箱页面草稿箱模块单击“草稿箱”导航按钮,进入草稿箱页面,如图6.7所示。草稿箱用来保存用户编辑好但是没有发送的邮件,用户可以在草稿箱中查看邮件信息,并可以进行发送。图6.7:草稿箱页面垃圾箱模块单击“垃圾箱”导航按钮,进入垃圾箱页面,如图6.7所示。垃圾箱主要用来保存从收件箱中删除的邮件。图6.8:垃圾箱页面通信录模块单击“通讯录”导航按钮,单击“添加”按钮,可添加联系人,单击“编辑”按钮,可编辑联系人信息,单击“删除”按钮,可删除联系人。通讯录页面如图6.9所示。其中添加按钮有两个子窗体组成,如图6.10和6.11所示。图6.9:通信录页面图6.10:添加联系人页面图6.11:添加分组页面6总结本客户端电子邮件软件在功能上基本符合用户需求,能够完成发送邮件和接收邮件的基本操作。但因知识水平及时间关系等各方面的原因,该系统还有许多不尽如人意的地方。本系统所运用Jmail组件和MAPI函数实现邮件收发功能的代码是在本人的师兄关某某的指导下完成的,由于时间紧迫所以一些服务器及相关电子邮件协议并未有透彻的理解,系统在功能方面也没有考虑得很周到。该系统界面的美观性和出错处理不够等多方面的问题,这些都有待进一步改善。另外,作为客户端电子管理软件,登录的邮箱应该多元化,本系统只提供单一的邮箱登陆,系统的进一步工作应该是实现多个邮箱同时登录,在同一时间管理用户多个电子邮箱,满足用户繁忙的信息通信要求。以上都是自己在开发的过程中做得不够好的地方,在这简单的总结,同时给自己一个告诫,希望自己以后考虑问题能做到全面化。参考文献[1]信息化/view/27.html?wtp=tt[2]电子邮件/view/1524.html?wtp=tt[3]WindowsLiveMailDesktop/view/753554.html?wtp=tt[4]Koomail/view/8266.html?wtp=tt[5]梦幻快车/view/1178031.html?wtp=tt[6]Foxmail/view/22049.html?wtp=tt[7]谭浩强.VisualC++程序设计.北京:清华大学出版社2004[8]李师贤.面向对象程序设计基础.北京:高等教育出版社2005[9]孙鑫.MFC深入详解.北京:电子工业出版社2006[10]侯俊杰.深入浅出MFC.武汉:华中理工大学出版社2001[11]任哲.MFCWindows应用程序设计(第2版).北京:清华大学出版社2007[12]姚领田.精通MFC程序设计.北京:人民邮电出版社2007DesignandImplementofE-mailClientSystemLiangWeitang(ComputerScienceandEngineeringDepartmentZhongkaiUniversityofAgricultureandTechnology,Guangzhou510225,China)Abstract:Withthedeepeningofreformandopeningupthedevelopmentoftheestablishmentofasocialistmarketeconomy,informationtechnologyisacceleratingthepaceofthetimes.Accordingtothelatestreleaseofthe2006-2020nationaldevelopmentstrategies,informationtechnologyisthefulluseofinformationtechnology,developmentandutilizationofinformationresources,facilitatetheexchangeofinformationandknowledge-sharingandimprovethequalityofeconomicgrowth,promotingeconomicandsocialdevelopmentofthehistoricalprocessoftransition.E-mailistheInternetnetwork,aswellasallothernetworksystemforthedirectexchangeofinformationbetweenthesystems,itsdatasenderandtherecipientareallhuman,sogreattomeetalotofpeopletherecommunicationsneeds.Inthispaper,in-depthunderstandingofthepracticaloperationofe-mailmanagementprocessonthebasisofsummingupthelifeofcommonlyusede-mailfunctions,object-orientedprogrammingusingdesignthinkingandthedevelopmentofasimple,conveniente-mailclientsoftware,therealizationofelectronicE-mailtheflexibilityinmanagement.Keywords:E-mailClientJmailgroupware附录资料:不需要的可以自行删除Word常用快捷键由于Word有定义快捷键的功能,在重新指定快捷键后,不能再使用该组合完成以前的操作。例如,按快捷键Ctrl+B可将选定文本改为加粗格式,如果将Ctrl+B重新指定给一个新的命令或其他命令,则不能通过按Ctrl+B为文本应用加粗格式,除非将快捷键指定恢复到初始设置。下面的列表使用说明如下:(1)表中出现的(F)、(E)、(V)、(I)、(O)、(T)、(A)、(W):分别代表文件、编辑、视图、插入、格式、工具、表格和窗口菜单。(2)(切换方式):表示重复按该键还原操作。(3)Num?:表示小键盘上的数字键。(4)Ctrl+A:表示Ctrl键和A键的组合,其余类推。A.1常规快捷键Ctrl+A(E)选取整篇文档(Ctrl+Num5)Ctrl+R可使段落右对齐Ctrl+B(E)加粗文本(Ctrl+Shift+B)Ctrl+](O)按磅值增加所选定内容的字号Ctrl+C(E)复制所选内容Ctrl+[(O)按磅值缩小所选定内容的字号Ctrl+D(O)修改选定字符格式Ctrl+=(O)将选定内容设为下标(切换方式)Ctrl+E(O)段落居中Ctrl++(O)将选定内容设为上标(切换方式)Ctrl+H(E)查找并修改指定文字或格式Ctrl+*(V)显示/隐藏所有非打印字符Ctrl+I(O)倾斜所选文字(切换方式)Ctrl+Tab(A)在单元格中插入制表符Ctrl+M(F)调整整段缩进Ctrl+L(O)段落左对齐Ctrl+N(F)创建新文档或模板Ctrl+Enter(O)在插入点插入一个分页符Ctrl+O(F)打开已有的文档或模板Ctrl+Up(E)将插入点上移一个段落Ctrl+P(F)打印文档(=Ctrl+Shift+F12)Ctrl+Down(E)将插入点下移一个段落Ctrl+Q(O)删除段落格式Ctrl+Home(E)将插入点移到文档开始Ctrl+S(F)保存当前活动文档Ctrl+End(E)将插入点移到文档结尾Ctrl+T(O)设置悬挂式缩进Alt+/(A)快速选定整个表格Ctrl+U(O)给所选内容添加下划线Shift+F1(W)有关命令、屏幕区域的帮助信息或文字属性Ctrl+V(E)在插入点插入剪贴板内容Ctrl+Alt+I打印预览Ctrl+W关闭文档Ctrl+K(E)插入超级链接Ctrl+X(E)剪切所选内容并将其放入剪贴板Ctrl+Shift+Space-bar创建不间断空格Ctrl+Y(E)重复上一步操作(=F4=Alt+Enter)Ctrl+连字符创建不间断连字符Ctrl+Z(E)取消上一步操作(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论