dsoframer 学习二

 近来由于工作需要,要求实现一个office文档在线编辑器,和有些office在线编辑控件不同,就是不提供本地文件的操作,而是对指定的远程office文件或远程数据库中的office文件进行操作,然后保存到数据库中。其实个人感觉远程文件的编辑与本地文件的编辑处理方式一样,先把远程office文件或保存到数据库中的office文件下载到本地临时文件夹内,然后进行修改,再上传到服务器这么一个大致过程。这里暂时不讨论有关上传和下载的问题,主要看office文件的在线编辑。

       关于office的在线编辑又朋友提示我用FCKedit控件,可是我发现它仅仅是在线编辑普通文本,对visio和ppt文档一点措施都没有,从网上(http://www.dsoframer.com/)找到了一个ActiveX控件dsoframer,一个用C++实现的office控件,决的还不错。就是帮助文件很少,还有以前是免费的,还有源代码,现在好像作者开始收费了,这个具体细节不清楚。言归正传:

1.注册这个dsoframer.ocx控件,

public bool Init()

  {

   try

   {

    Assembly thisExe = Assembly.GetExecutingAssembly();

    System.IO.Stream myS = thisExe.GetManifestResourceStream("NameSpaceName.dsoframer.ocx");

   

    string sPath = “该ocx文件的实际路径”+ @"/dsoframer.ocx";

    ProcessStartInfo psi = new ProcessStartInfo("regsvr32","/s " +sPath);

    Process.Start(psi);

   }

   catch(Exception ex)

   {

    MessageBox.Show(ex.Message);

   }

   return true;

  }

2.向winform中添加该控件

AxDSOFramer.AxFramerControl axFramerControl1 = new AxDSOFramer.AxFramerControl();

this.Controls.Add(axFramerControl1);

axFramerControl1.Dock = System.Windows.Forms.DockStyle.Fill;

至此,运行该程序就可以使用了。

 

 

经过初步使用和测试发现dsoframer.ocx的一些问题:

      1.  不能加载mdb和pub文件

      2.  word操作中的打印预览关闭可能导致整个窗口关闭(有时)

3.  不能打开没有初始化过的vsd文件,但可以打开自己创建的vsd文件

4.  操作excel的时候delete键有时候会失灵

5.  只支持打开一个文件,对上一个文件采取关闭不提示保存

6.  控件初始化后的菜单是不能单个进行隐藏,只能统一隐藏菜单栏

但是它给我们返回了一个很重要的信息:它给我们返回了当前操作的文档对象,经过初步测试,可以强制转换为office文档对象

   Object myObj = this.axFramerControl1.ActiveDocument;

   if(myObj == null)

   {

    return;

   }

   //如果当前打开的是word

   Word.Document wdoc = (Word.Document)myObj;

我觉得这就给我们留下了很大的空间,我们可以通过wdoc这个对象发布我们自己的事件,添加我们自己的菜单以及菜单事件处理程序,添加工具栏和工具栏事件处理程序。这就告诉我们可以使用VBA开发来操作文档了。

 

通过这些天使用我们可以得到当前操作的文档对象(我还以自己测试的word文档为例),但是要明确一点,添加菜单不仅仅是针对当前word文档,而是当前机器上的word程序,你可以通过当前文档添加,但添加之后就会一直保存,你随便打开一个本地word文档,菜单都会出现,因此我们在关闭应用程序的时候(或退出的时候)要delete。

//主菜单属于CommandBarPopup类型

//子菜单属于Microsoft.Office.Core.CommandBarButton

   Microsoft.Office.Core.CommandBarPopup myMenu;

   Object missing = System.Type.Missing;

   Microsoft.Office.Core.CommandBarButton myChileMenu;

   Word.ApplicationClass myWord = new Word.ApplicationClass();

   Microsoft.Office.Core.CommandBar MainMenuBar =  myWord.CommandBars.ActiveMenuBar;

   Object temp = true;

//添加主菜单

   myMenu= (Microsoft.Office.Core.CommandBarPopup)MainMenuBar.Controls.Add(

      Microsoft.Office.Core.MsoControlType.msoControlPopup, missing, missing, missing, temp);

   myMenu.Caption = "Test(&B)";

     myMenu.Visible = true;

     myMenu.Tag = Object;

//给主菜单添加子菜单

    myChileMenu= (Microsoft.Office.Core.CommandBarButton)      myMenu.Controls.Add (Microsoft.Office.Core.MsoControlType.msoControlButton, missing,missing, missing, true);

    myChileMenu.Caption = "MessageBox";

    myChileMenu.Visible = true;

    myChileMenu.Tag = "Test";

//给子菜单添加事件

    myChileMenu.Click +=new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(myChileMenu_Click);

//子菜单的事件处理程序

private void myChileMenu_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault)

  {

   try

   {

    MessageBox.Show("菜单事件完成了!");

   }

   catch(Exception ex)

   {

    MessageBox.Show(ex.Message);

   }

  }

     

  在退出应用程序的时候,需要调用自定义菜单的delete(),一般先从子菜单删除,逐级到最高级主菜单,调用删除方法:myChileMenu.delete(true&false);myMenu.delete(false);

你可能感兴趣的:(DSOframer)