程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件

使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件

編輯:關於JAVA

看完這篇文章,可以開發如下的界面:

沒有嵌入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.java
1package cn.blogjava.youxia.views;
2
3import 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;
9
10public class OleView extends ViewPart {
11  public OleFrame frame;
12
13  public static final String ID = "cn.blogjava.youxia.views.OleView"; // $NON-NLS-1$
14
15  /** *//**
16   * Create contents of the view part
17   * @param parent
18   */
19  @Override
20  public void createPartControl(Composite parent) {
21    frame = new OleFrame(parent, SWT.NONE);
22
23    //
24    createActions();
25    initializeToolBar();
26    initializeMenu();
27  }
28
29  /** *//**
30   * Create the actions
31   */
32  private void createActions() {
33    // Create the actions
34  }
35
36  /** *//**
37   * Initialize the toolbar
38   */
39  private void initializeToolBar() {
40    IToolBarManager toolbarManager = getViewSite().getActionBars()
41        .getToolBarManager();
42  }
43
44  /** *//**
45   * Initialize the menu
46   */
47  private void initializeMenu() {
48    IMenuManager menuManager = getViewSite().getActionBars()
49        .getMenuManager();
50  }
51
52  @Override
53  public void setFocus() {
54    // Set the focus
55  }
56
57}
58

在這個視圖中,我創建了OleFrame對象,並讓它是public的,至於OleClientSite和 OleAutomation對象,我們在點擊菜單項後創建。菜單動作的代碼如下:

OpenFileAction.java
1package cn.blogjava.youxia.actions;
2
3
4import 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;
15
16public class OpenFileAction implements IWorkbenchWindowActionDelegate {
17
18  IWorkbenchWindow window;
19
20  public void dispose() {
21    // TODO 自動生成方法存根
22
23  }
24
25  public void init(IWorkbenchWindow window) {
26    // TODO 自動生成方法存根
27    this.window = window;
28
29  }
30
31  public void run(IAction action) {
32    // TODO 自動生成方法存根
33
34    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 oa = new OleAutomation(client);
42          Variant str = new Variant ("http://www.blogjava.net/");
43          oa.invoke(104, new Variant[]{str});
44
45       }
46    }
47    
48  }
49
50  public void selectionChanged(IAction action, ISelection selection) {
51    // TODO 自動生成方法存根
52
53  }
54
55}
56

根據前面幾節將的內容配置plugin.xml和修改Perspective.java的代碼,就可以看到文章 開頭的效果了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved