京山游俠

          專注技術,拒絕扯淡
          posts - 50, comments - 868, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          使用Eclipse RCP進行桌面程序開發(一):快速起步
          使用Eclipse RCP進行桌面程序開發(二):菜單、工具欄和對話框
          使用Eclipse RCP進行桌面程序開發(三):視圖和透視圖

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

          沒有嵌入Active X控件的視圖:
          rcp29.JPG

          嵌入瀏覽器控件,并顯示www.aygfsteel.com的主頁:
          rcp30.JPG

          在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就可以,如下:
          1OleFrame?frame?=?new?OleFrame(parent,?SWT.NONE);
          在這個構造函數中,第一個參數指的是該OleFrame的母窗口部件,即Active X控件將要被嵌入的窗口部件。

          在OleFrame的基礎上就可以創建OleClientSite對象,創建該對象需要知道控件的programID,這個ID的信息存放在windows的注冊表中。在我們這篇文章的例子中,我們使用的是一個瀏覽器控件,那么我們怎么知道瀏覽器控件的ProgID呢?我使用的是Visual Studio 2003自帶的OleView工具,如下圖:
          rcp26.JPG

          可以看到,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.aygfsteel.com的主頁。對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.aygfsteel.com");

          那么我們怎么才能得到Active X控件的方法的ID,還有它需要哪些參數呢?還是要借助前面提到的OleView.exe工具,如下圖:
          rcp27.JPG

          rcp28.JPG

          可以看到,Navigate方法的id為0x00000068,轉化為十進制就是104,而它需要的參數第一個是一個字符串,其它的都是可選的,因此,我們可以這樣調用它的方法:
          Variant?url?=?new?Variant("http://www.aygfsteel.com/");
          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.aygfsteel.com/");
          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的代碼,就可以看到文章開頭的效果了。

          評論

          # re: 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件  回復  更多評論   

          2007-08-14 14:48 by 同聲翻譯公司
          報考條件、考試程序及招生情況

            口譯專業屬應用類研究生,考試不同于其他專業,具有很強的實踐性。據筆者了解,入學考試多不開列參考書目,筆試也不考理論知識。筆試內容多為段落改寫、填空、寫作、英漢雙向筆譯、綜合知識測試等實際操作的內容。這些全靠考生平時的知識積淀和能力培養。

            該考試另外一個特殊性是該專業錄取時以考生的復試成績為主。上海外國語大學翻譯學院院長柴明熲教授告訴筆者,學員在入學考試時除了要通過筆試外,口試即復試是選拔人才的重中之重。只有在復試中才能對英文聽力理解和口語表達能力進行客觀的考查。

            據了解,北外的復試包括:

            1.視譯:將一篇英文稿口頭翻譯成漢語。

            2.復述:先聽兩遍英文錄音(時間:3—5分鐘,可作筆記),再將聽到的內容用英文復述一遍。

            3.面試。

            上外復試包括:

            1.演講:從考試委員會提供的若干題目中挑選其中之一,作2—3分鐘的即興演講。

            2.復述:聽1—2分鐘的演講,然后以另一種語言用自己的話復述演講內容。

            3.視譯:聽一篇短文,瀏覽該文1分鐘,然后將其內容口頭譯出。

            4.問答與對話。

          # re: 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件  回復  更多評論   

          2008-05-08 14:42 by hello
          尊敬的博主,你好!

          本人想在view中以ole或 activex方式使用word的 插入->對象。。。功能,即點擊view中一個按鈕,其響應的事件是彈出word中的一個功能界面(即word的插入->對象。。。點擊所出來的界面 ),然后選中某個對象(如一個圖片對象)后,讓它顯示在我的view中的image控件上。不知道此功能能否實現,該如何去做?
          另外還有一個怪現象想請教博主:
          1 本人的RCP項目名在開機后出現報錯(紅叉),但結果都可以運行出來,無任何錯誤信息顯示于控制臺。(不知道是否與我前天晚上突然斷電有關)
          2 我修改程序,在主菜單上加一個新的菜單項,但運行結果始終出不來,也無報錯提示(包名上的錯誤依舊),但導出產品后運行產品則出現正確的結果,即:菜單項出現。請問這是什么原因?。吭撊绾谓鉀Q次問題?
          多謝指點了??!不甚感激?。?
          emaiL:ljju123@163.com

          # re: 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件  回復  更多評論   

          2008-05-15 17:40 by fy_kenny
          可能你的環境中缺少了某個包了.

          # re: 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件  回復  更多評論   

          2008-08-14 09:03 by QQ:71163952
          如果我要在SWT中同時顯示兩個以上的IE界面,怎么辦。

          # re: 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件  回復  更多評論   

          2009-04-02 17:20 by 創意產品網
          收藏先

          # re: 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件  回復  更多評論   

          2010-12-15 19:23 by luobo
          真在了解olebrowser,謝謝了

          # re: 使用Eclipse RCP進行桌面程序開發(四):在Windows中使用Active X控件  回復  更多評論   

          2014-03-19 10:15 by tyl
          發現樓主寫的很詳細,學習了。謝謝。
          主站蜘蛛池模板: 东丽区| 忻州市| 宣威市| 江门市| 娄烦县| 福州市| 昆明市| 景谷| 塔河县| 武功县| 大厂| 岳普湖县| 甘南县| 盘山县| 营山县| 独山县| 东丽区| 皋兰县| 托里县| 临洮县| 化州市| 北碚区| 政和县| 巴林右旗| 专栏| 军事| 宝坻区| 沅陵县| 彰武县| 商洛市| 灵宝市| 灵武市| 抚州市| 曲靖市| 丰宁| 清徐县| 招远市| 团风县| 华阴市| 洛川县| 拜城县|