(转)WinForm邮件内容编辑器的简单实现

 

 本文转自http://www.cnblogs.com/sendrylee/archive/2012/05/24/WinForm%E9%82%AE%E4%BB%B6%E5%86%85%E5%AE%B9%E7%BC%96%E8%BE%91%E5%99%A8.html

 

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交互达到的内容编辑器的效果,但它的实现却是需要去完成单个单个的功能最后组合而成,例如,实现剪切的功能的核心代码:

复制代码
1 public void Cut()
2 {
3     webBrowser1.Document.ExecCommand("Cut"falsenull);
4 }
5 public void Bold()
6 {
7    webBrowser1.Document.ExecCommand("Bold"falsenull);
8 }
复制代码

这种方法是不是太过复杂?!而且维护起来也不方便。既然是webBrowser和HTML的交互实现原来,那为什么我们不直接做一个纯HTML的邮件编辑器,然后再来和webBrowser交互呢?!这就是我今天要介绍方法的核心原理。下面我们来看看它的实现过程:


第一步:纯HTML内容编辑器
其实这一步最简单,基本上您在网上搜索HTML内容编辑器,就会有一大堆出现在您面前。既然是纯HTML的,记住一定是双击既可以打开预览的。如图:

当然了,我们还是要写一点必要的JS,便于获取和设置从webBrowser控件传出来的内容。

复制代码
<script>
//获取邮件内容
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.

 

posted @ 2012-09-08 10:33  C#老头子  Views(1435)  Comments(1Edit  收藏  举报