加载中…
个人资料
xtaihcidt
xtaihcidt
  • 博客等级:
  • 博客积分:0
  • 博客访问:783
  • 关注人气:21
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在Windows中使用Active X控件

(2011-09-23 15:57:18)
标签:

rcp

eclipse

active

控件

杂谈

分类: rcp插件开发
没有嵌入Active X控件的视图:
http://image.360doc.com/DownloadImg/10754/277069_1.JPGX控件" />

嵌入浏览器控件,并显示www.blogjava.net的主页:
http://image.360doc.com/DownloadImg/10754/277069_2.JPGX控件" />

在Windows系统下,OLE和Active X控件是两个非常吸引人的技术,它们的基础都是COM。OLE的体验,就是平时我们可以把Excel表格嵌入Word文档,或者把PDF嵌入浏览器显示一样,而Active X控件更是无处不在,做VB开发和网页开发的人都应该很熟悉。使用Windows系统中丰富的Active X控件资源,我们可以实现功能非常强大的程序。

在Windows平台下,SWT图形工具包提供了对OLE的支持,Active X控件和OLE文档都可以被很方便地嵌入SWT窗口部件或者JFace部件,在这里,我只讨论将Active X控件插入视图。

在一个视图中包含一个Active X控件需要两个对象的支持,即一个OleFrame和一个OleClientSite对象。如果需要创建一个OLE应用,需要先后创建他们。创建OleFrame对象比较简单,OleFrame类定义在org.eclipse.swt.ole.win32中,创建OleFrame对象只需要简单的new就可以,如下:
1http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />OleFrame frame = new OleFrame(parent, SWT.NONE);
在这个构造函数中,第一个参数指的是该OleFrame的母窗口部件,即Active X控件将要被嵌入的窗口部件。

在OleFrame的基础上就可以创建OleClientSite对象,创建该对象需要知道控件的programID,这个ID的信息存放在windows的注册表中。在我们这篇文章的例子中,我们使用的是一个浏览器控件,那么我们怎么知道浏览器控件的ProgID呢?我使用的是Visual Studio 2003自带的OleView工具,如下图:
http://image.360doc.com/DownloadImg/10754/277069_4.JPGX控件" />

可以看到,Microsoft Web 浏览器的ProgID为Shell.Explorer.2,我们可以这样创建OleClientSite对象:
1http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />OleClientSite client = new OleClientSite(frame,SWT.NONE,"Shell.Explorer.2");

创建对象后,还需要激活,才能够在RCP程序中对这些OLE对象进行操作。如下:
http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />client.doVerb(OLE.OLEIVERB_SHOW);

然后,我们需要操作这个Active X控件,调用它的方法,或者设置它的属性。比如在此例中,我们需要调用浏览器控件的navigate方法,以便我们的浏览器控件显示www.blogjava.net的主页。对Active X控件的操作通过OleAutomation对象来实现,创建OleAutomation对象的方法如下:
http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />OleAutomation automation = new OleAutomation(client);
再通过automation.invoke()来调用Active X控件的方法,其中invoke方法有几种重载形式,有只带一个int参数的,也有带int和Variant[]两个参数的,其中的int参数表示要调用的Active X控件的方法的ID,Variant[]参数就是要传递给Active X控件的方法的参数。

这里我们要说一说Variant类,这个类提供了多个构造函数,可以方便的将int,float,long,double,string等等基本数据类型封装为Variant,比如我们要传递给浏览器控件的navigate方法的地址参数:
http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />Variant url = new Variant("http://www.blogjava.net");

那么我们怎么才能得到Active X控件的方法的ID,还有它需要哪些参数呢?还是要借助前面提到的OleView.exe工具,如下图:
http://image.360doc.com/DownloadImg/10754/277069_9.JPGX控件" />

http://image.360doc.com/DownloadImg/10754/277069_10.JPGX控件" />

可以看到,Navigate方法的id为0x00000068,转化为十进制就是104,而它需要的参数第一个是一个字符串,其它的都是可选的,因此,我们可以这样调用它的方法:
http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />Variant url = new Variant("http://www.blogjava.net/");
http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />
{url});

下面,贴出本文例子中的视图的代码和菜单Action的代码,在写这篇文章之前,我一直在探索怎样从菜单控制视图,后来发现是这样:
 window.getActivePage.getViewReferences();
虽然我不知道Eclipse中Page的概念究竟是什么,但是只要能找到我要操作的视图就可以了。视图的代码如下:

OleView.java
 1http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />package cn.blogjava.youxia.views;
 2http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />
 3http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.jface.action.IMenuManager;
 4http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.jface.action.IToolBarManager;
 5http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.SWT;
 6http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.widgets.Composite;
 7http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.ui.part.ViewPart;
 8http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.ole.win32.OleFrame;
 9http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />
10在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件public class OleView extends ViewPart 在Windows中使用Active <wbr>X控件{
11http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />    public OleFrame frame;
12http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
13http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />    public static final String ID = "cn.blogjava.youxia.views.OleView"//$NON-NLS-1$
14http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
15在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件    
19http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />    @Override
20http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
21http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        frame = new OleFrame(parent, SWT.NONE);
22http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        
23http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        //
24http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        createActions();
25http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        initializeToolBar();
26http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        initializeMenu();
27http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

28http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
29在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件    
32http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
33http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        // Create the actions
34http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

35http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
36在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件    
39http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
40http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        IToolBarManager toolbarManager = getViewSite().getActionBars()
41http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />                .getToolBarManager();
42http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

43http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
44在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件    
47http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
48http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        IMenuManager menuManager = getViewSite().getActionBars()
49http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />                .getMenuManager();
50http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

51http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
52http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />    @Override
53http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
54http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        // Set the focus
55http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

56http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
57在Windows中使用Active <wbr>X控件}

58http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />

在这个视图中,我创建了OleFrame对象,并让它是public的,至于OleClientSite和OleAutomation对象,我们在点击菜单项后创建。菜单动作的代码如下:

OpenFileAction.java
 1http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />package cn.blogjava.youxia.actions;
 2http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />
 3http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />
 4http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.jface.action.IAction;
 5http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.jface.viewers.ISelection;
 6http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.SWT;
 7http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.ole.win32.OLE;
 8http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.ole.win32.OleClientSite;
 9http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.ui.IWorkbenchWindow;
10http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.ui.IWorkbenchWindowActionDelegate;
11http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.ui.*;
12http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import cn.blogjava.youxia.views.*;
13http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.ole.win32.OleAutomation;
14http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />import org.eclipse.swt.ole.win32.Variant;
15http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />
16在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件public class OpenFileAction implements IWorkbenchWindowActionDelegate 在Windows中使用Active <wbr>X控件{
17http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
18http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />    IWorkbenchWindow window;
19http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />    
20http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
21http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        // TODO 自动生成方法存根
22http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
23http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

24http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
25在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件    public void init(IWorkbenchWindow window) 在Windows中使用Active <wbr>X控件{
26http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        // TODO 自动生成方法存根
27http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        this.window = window;
28http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
29http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

30http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
31在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件    public void run(IAction action) 在Windows中使用Active <wbr>X控件{
32http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        // TODO 自动生成方法存根
33http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        
34http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        IViewReference[] vfs = window.getActivePage().getViewReferences();
35http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        IViewPart vw;
36http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
37http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />             vw = vfs[i].getView(false);
38http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{
39http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />                    OleClientSite client = new OleClientSite(((OleView)vw).frame,SWT.NONE,"Shell.Explorer.2");
40http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />                    client.doVerb(OLE.OLEIVERB_SHOW);
41http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />                    OleAutomation oa = new OleAutomation(client);
42http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />                    Variant str = new Variant("http://www.blogjava.net/");
43http://image.360doc.com/DownloadImg/10754/277069_14.gifX控件" TITLE="在Windows中使用Active X控件" />{str});
44http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        
45http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />             }

46http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />        }

47http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        
48http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

49http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
50在Windows中使用Active <wbr>X控件在Windows中使用Active <wbr>X控件    public void selectionChanged(IAction action, ISelection selection) 在Windows中使用Active <wbr>X控件{
51http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />        // TODO 自动生成方法存根
52http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
53http://image.360doc.com/DownloadImg/10754/277069_35.gifX控件" TITLE="在Windows中使用Active X控件" />    }

54http://image.360doc.com/DownloadImg/10754/277069_27.gifX控件" TITLE="在Windows中使用Active X控件" />
55在Windows中使用Active <wbr>X控件}

56http://image.360doc.com/DownloadImg/10754/277069_3.gifX控件" TITLE="在Windows中使用Active X控件" />

根据前面几节将的内容配置plugin.xml和修改Perspective.java的代码,就可以看到文章开头的效果了

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有