(转)WinForm邮件内容编辑器的简单实现
1、概述
在WinForm开发中,您可能会碰到发送邮件时内容编辑的问题,大部分开发人员第一个想法是希望将 WinForm中的内容编辑器做到和.NET
中类似FCK一样。今天我们就来介绍下如何实现和FCK一样的内容编辑器功能。
2、正文
邮件内容编辑器的问题,在网上搜索一下,碰到这个的问题的人还不少,大多数开发者参考的下面这篇文章中的内容:http://www.codeproject.com/cs/miscctrl/editor_in_windows_forms.asp且不说这篇文章中实现的方法的好坏。但里面包含的Microsoft.MSHTML.dll,动辄7M多,实在是让人看了不舒服。又或是利用WindowsLive.Writer.Interop.Mshtml和WindowsLive.Writer.Mshtml两个组件来实现,维护起来相当麻烦,代码就更不好看懂了。今天我向大家介绍一种新的内容编辑器的实现,彻底解决上述的问题,总大小不过几百KB。
首先我们来分析下实现的原理。在上述那个例子中,它利用C#中的webBrowser控件和HTML交互达到的内容编辑器的效果,但它的实现却是需要去完成单个单个的功能最后组合而成,例如,实现剪切的功能的核心代码:
2 {
3 webBrowser1.Document.ExecCommand("Cut", false, null);
4 }
5 public void Bold()
6 {
7 webBrowser1.Document.ExecCommand("Bold", false, null);
8 }
这种方法是不是太过复杂?!而且维护起来也不方便。既然是webBrowser和HTML的交互实现原来,那为什么我们不直接做一个纯HTML的邮件编辑器,然后再来和webBrowser交互呢?!这就是我今天要介绍方法的核心原理。下面我们来看看它的实现过程:
第一步:纯HTML内容编辑器
其实这一步最简单,基本上您在网上搜索HTML内容编辑器,就会有一大堆出现在您面前。既然是纯HTML的,记住一定是双击既可以打开预览的。如图:
当然了,我们还是要写一点必要的JS,便于获取和设置从webBrowser控件传出来的内容。
//获取邮件内容
function GetContent(){
return editor.html();
}
function GetTitile(){
return document.getElementById('txttile').value;
}
function GetFileUrl(){
return document.getElementById('txtfile').value;
}
function SetTitile(arg){
document.getElementById('txttile').value=arg;
}
function SetContent(arg){
editor.html(arg);}
</script>
第二步:内容交互
这里比较简单,就是一个从webBrowser1中执行JS函数的核心代码:
webBrowser1.Document.InvokeScript("SetContent", objArray);
其他部分,没什么好说明的,直接看代码吧。
View Code using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Security.Permissions; //需加的 namespace EmailEdit { [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]//需加的 [System.Runtime.InteropServices.ComVisibleAttribute(true)]//需加的 public partial class SendEmail : Form { public SendEmail() { InitializeComponent(); } private void SendEmail_Load(object sender, EventArgs e) { webBrowser1.Navigate(Application.StartupPath + "/edit/editemail.html"); } //获取邮件信息 private void button1_Click(object sender, EventArgs e) { string strtitle = webBrowser1.Document.InvokeScript("GetTitile").ToString(); string strfile = webBrowser1.Document.InvokeScript("GetFileUrl").ToString(); string strcontent = webBrowser1.Document.InvokeScript("GetContent").ToString(); MessageBox.Show("邮件的标题是:" + strtitle + "\n" + "附件:" + strfile + "\n" + "内容:" + strcontent); } //设置邮件信息 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //邮件标题 string strtitle = "这是标题"; Object[] objArray = new Object[1]; objArray[0] = (Object)strtitle; webBrowser1.Document.InvokeScript("SetTitile", objArray); //邮件内容 string name = @"<font color=""#FF0000""><h1>hello world</h1></font>!sendry lee."; objArray = new Object[1]; objArray[0] = (Object)name; webBrowser1.Document.InvokeScript("SetContent", objArray); } } }
第三步:运行
看实现的效果和图片吧:
如果对您有帮助别忘了分享给其他人,感谢您的阅读!
注: 也可以用WindowsLive.Writer.Interop.Mshtml和WindowsLive.Writer.Mshtml两个小文件来替代Microsoft.MSHTML.dll这个庞然大物的dll.