看完这篇文章,可以开发如下的界面:
没有嵌入Active X控件的视图:
嵌入浏览器控件,并显示www.blogjava.net的主页:
在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就可以,如下:
OleFrame. frame. = new OleFrame(parent, SWT.NONE);
在这个构造函数中,第一个参数指的是该OleFrame的母窗口部件,即Active X控件将要被 嵌入的窗口部件。
在OleFrame的基础上就可以创建OleClientSite对象,创建该对象需要知道控件的 programID,这个ID的信息存放在windows的注册表中。在我们这篇文章的例子中,我们使用 的是一个浏览器控件,那么我们怎么知道浏览器控件的ProgID呢?我使用的是Visual Studio 2003自带的OleView工具,如下图:
可以看到,Navigate方法的id为0x00000068,转化为十进制就是104,而它需要的 参数第一个是一个字符串,其它的都是可选的,因此,我们可以这样调用它的方法:
可以看到,Microsoft Web 浏览器的ProgID为Shell.Explorer.2,我们可以这样创建 OleClientSite对象:
1OleClientSite client = new OleClientSite (frame,SWT.NONE,”Shell.Explorer.2″);
创建对象后,还需要激活,才能 够在RCP程序中对这些OLE对象进行操作。如下:
client.doVerb (OLE.OLEIVERB_SHOW);
然后,我们需要操作这个Active X控件,调用它的方法,或者 设置它的属性。比如在此例中,我们需要调用浏览器控件的navigate方法,以便我们的浏览 器控件显示www.blogjava.net的主页。对Active X控件的操作通过OleAutomation对象来实现 ,创建OleAutomation对象的方法如下:
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方法的地址参数:
Variant url = new Variant(“http://www.blogjava.net”);
那么我们怎么才能得到Active X控件的方法的ID,还有它需要哪些参数呢?还是要借助前 面提到的OleView.exe工具,如下图:
Variant url = new Variant("http://www.blogjava.net/");automation.invoke(104, new Variant[]{url});
下面,贴出本文例子中的视图的代码和菜单Action的代码,在写这篇文章之前,我一直在 探索怎样从菜单控制视图,后来发现是这样:
window.getActivePage.getViewReferences();
虽然我不知道Eclipse中Page的概念究竟是什么,但是只要能找到我要操作的视图就可以 了。视图的代码如下:
OleView.java1package cn.blogjava.youxia.views;23import org.eclipse.jface.action.IMenuManager;4import org.eclipse.jface.action.IToolBarManager;5import org.eclipse.swt.SWT;6import org.eclipse.swt.widgets.Composite;7import org.eclipse.ui.part.ViewPart;8import org.eclipse.swt.ole.win32.OleFrame;910public class OleView extends ViewPart {11 public OleFrame. frame;1213 public static final String ID = "cn.blogjava.youxia.views.OleView"; // $NON-NLS-1$1415 /** *//**16 * Create contents of the view part17 * @param parent18 */19 @Override20 public void createPartControl(Composite parent) {21 frame. = new OleFrame(parent, SWT.NONE);2223 //24 createActions();25 initializeToolBar();26 initializeMenu();27 }2829 /** *//**30 * Create the actions31 */32 private void createActions() {33 // Create the actions34 }3536 /** *//**37 * Initialize the toolbar38 */39 private void initializeToolBar() {40 IToolBarManager toolbarManager = getViewSite().getActionBars()41 .getToolBarManager();42 }4344 /** *//**45 * Initialize the menu46 */47 private void initializeMenu() {48 IMenuManager menuManager = getViewSite().getActionBars()49 .getMenuManager();50 }5152 @Override53 public void setFocus() {54 // Set the focus55 }5657}58
在这个视图中,我创建了OleFrame对象,并让它是public的,至于OleClientSite和 OleAutomation对象,我们在点击菜单项后创建。菜单动作的代码如下:
OpenFileAction.java1package cn.blogjava.youxia.actions;234import org.eclipse.jface.action.IAction;5import org.eclipse.jface.viewers.ISelection;6import org.eclipse.swt.SWT;7import org.eclipse.swt.ole.win32.OLE;8import org.eclipse.swt.ole.win32.OleClientSite;9import org.eclipse.ui.IWorkbenchWindow;10import org.eclipse.ui.IWorkbenchWindowActionDelegate;11import org.eclipse.ui.*;12import cn.blogjava.youxia.views.*;13import org.eclipse.swt.ole.win32.OleAutomation;14import org.eclipse.swt.ole.win32.Variant;1516public class OpenFileAction implements IWorkbenchWindowActionDelegate {1718 IWorkbenchWindow window;1920 public void dispose() {21 // TODO 自动生成方法存根2223 }2425 public void init(IWorkbenchWindow window) {26 // TODO 自动生成方法存根27 this.window = window;2829 }3031 public void run(IAction action) {32 // TODO 自动生成方法存根3334 IViewReference[] vfs = window.getActivePage().getViewReferences ();35 IViewPart vw;36 for(int i=0; i<vfs.length; i++){37 vw = vfs[i].getView(false);38 if(vw.getTitle().equals("使用Active X控件")){39 OleClientSite client = new OleClientSite(((OleView) vw).frame,SWT.NONE,"Shell.Explorer.2");40 client.doVerb(OLE.OLEIVERB_SHOW);41 OleAutomation a = new OleAutomation(client);42 Variant str = new Variant ("http://www.blogjava.net/");43 oa.invoke(104, new Variant[]{str});4445 }46 }47 48 }4950 public void selectionChanged(IAction action, ISelection selection) {51 // TODO 自动生成方法存根5253 }5455}56
根据前面几节将的内容配置plugin.xml和修改Perspective.java的代码,就可以看到文章 开头的效果了。
生活不要太劳累,弄得自己很疲惫,快乐幸福多体会,