treenode

          在路上。

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            5 Posts :: 1 Stories :: 53 Comments :: 0 Trackbacks
          可能是為了保持平臺(tái)獨(dú)立性,SWT沒(méi)有開(kāi)放許多控件的自定義接口。例如,Win32中的Button、Label、List和ComboBox都是可以自繪(Owner Draw)的,但是SWT并沒(méi)有把這些繪制方法開(kāi)放出來(lái)。在最新的3.2版本中添加的一個(gè)新特性是Table和Tree現(xiàn)在支持Custom Draw了(但是并未整合到Viewer體系中),不過(guò)對(duì)于上述控件的支持仍付闕如。

          上一次,我實(shí)現(xiàn)了一個(gè)自繪的按鈕。現(xiàn)在,看到有人詢(xún)問(wèn)是否可以在Combo的列表中加入圖像。其實(shí)這相當(dāng)容易,只要重載Combo Widget并把自繪接口暴露出來(lái)即可。以下是簡(jiǎn)單的代碼示例:

          package?org.eclipse.swt.widgets;

          import?java.io.*;

          import?org.eclipse.swt.SWT;
          import?org.eclipse.swt.graphics.*;
          import?org.eclipse.swt.internal.win32.*;

          public?class?CustomCombo?extends?Combo
          {
          ????
          public?CustomCombo(?Composite?parent,?int?style?)
          ????{
          ????????
          super(?parent,?style?);

          ????????
          try
          ????????{
          ????????????InputStream?is?
          =?getClass().getResourceAsStream(?"bullet.gif"?);
          ????????????image?
          =?new?Image(?getDisplay(),?is?);
          ????????????is.close();
          ????????}
          ????????
          catch?(?IOException?e?)
          ????????{
          ????????????e.printStackTrace();
          ????????}
          ????????
          final?int?CB_SETITEMHEIGHT?=?0x0153;

          ????????OS.SendMessage(?handle,?CB_SETITEMHEIGHT,?
          0,?24?);
          ????????OS.SendMessage(?handle,?CB_SETITEMHEIGHT,?
          -1,?24?);
          ????}

          ????@Override
          ????
          int?widgetStyle()
          ????{
          ????????
          final?int?CBS_OWNERDRAWFIXED?=?0x0010;
          ????????
          final?int?CBS_HASSTRINGS?=?0x0200;
          ????????
          //?final?int?CBS_OWNERDRAWVARIABLE?=?0x0020;
          ????????return?super.widgetStyle()?|?CBS_OWNERDRAWFIXED?|?CBS_HASSTRINGS;
          ????}

          ????@Override
          ????
          protected?void?checkSubclass()
          ????{
          ????}

          ????@Override
          ????
          public?void?dispose()
          ????{
          ????????image.dispose();
          ????????
          super.dispose();
          ????}

          ????
          /*?@Override
          ????LRESULT?wmMeasureChild(?int?wParam,?int?lParam?)
          ????{
          ????????MEASUREITEMSTRUCT?mis?=?new?MEASUREITEMSTRUCT();
          ????????OS.MoveMemory(?mis,?lParam,?MEASUREITEMSTRUCT.sizeof?);
          ????????mis.itemHeight?=?40;
          ????????OS.MoveMemory(?lParam,?mis,?MEASUREITEMSTRUCT.sizeof?);
          ????????return?null;?//?super.wmMeasureChild(?wParam,?lParam?);
          ????}?
          */

          ????@Override
          ????LRESULT?wmDrawChild(?
          int?wParam,?int?lParam?)
          ????{
          ????????DRAWITEMSTRUCT?dis?
          =?new?DRAWITEMSTRUCT();
          ????????OS.MoveMemory(?dis,?lParam,?DRAWITEMSTRUCT.sizeof?);

          ????????GC?gc?
          =?new?GC(?new?DCWrapper(?dis.hDC?)?);
          ????????Rectangle?rc?
          =?new?Rectangle(?dis.left,?dis.top,?dis.right?-?dis.left,
          ????????????????dis.bottom?
          -?dis.top?);
          ????????Display?display?
          =?getDisplay();
          ????????
          if?(?(dis.itemState?&?OS.ODS_SELECTED)?!=?0?)
          ????????{
          ????????????gc
          ????????????????????.setBackground(?display
          ????????????????????????????.getSystemColor(?SWT.COLOR_LIST_SELECTION?)?);
          ????????????gc.setForeground(?display
          ????????????????????.getSystemColor(?SWT.COLOR_LIST_SELECTION_TEXT?)?);
          ????????????gc.fillRectangle(?rc?);
          ????????}
          ????????
          else
          ????????{
          ????????????gc.setBackground(?display
          ????????????????????.getSystemColor(?SWT.COLOR_LIST_BACKGROUND?)?);
          ????????????gc.setForeground(?display
          ????????????????????.getSystemColor(?SWT.COLOR_LIST_FOREGROUND?)?);
          ????????????gc.fillRectangle(?rc?);
          ????????}
          ????????String?text?
          =?getItem(?dis.itemID?);
          ????????gc.drawImage(?image,?dis.left?
          +?1,?dis.top?+?1?);
          ????????gc.drawText(?text,?dis.left?
          +?20,?dis.top?);

          ????????gc.dispose();

          ????????
          return?null;
          ????}

          ????
          private?static?class?DCWrapper?implements?Drawable
          ????{
          ????????
          private?int????hdc;

          ????????DCWrapper(?
          int?hdc?)
          ????????{
          ????????????
          this.hdc?=?hdc;
          ????????}

          ????????
          public?int?internal_new_GC(?GCData?data?)
          ????????{
          ????????????
          return?hdc;
          ????????}

          ????????
          public?void?internal_dispose_GC(?int?handle,?GCData?data?)
          ????????{
          ????????}
          ????}

          ????
          private?Image????image;
          }


          值得說(shuō)明的是,如果設(shè)置Combo為OwnerDraw Variable風(fēng)格,則必須重載wmMeasureChild方法來(lái)指定每一項(xiàng)的高度。如果使用OwnerDraw Fixed風(fēng)格,則只需要在構(gòu)造的時(shí)候發(fā)送一條CB_SETITEMHEIGHT消息就行了。

          ?另外一種值得考慮的選擇是將Win32的ComboBoxEx控件包裝成SWT Widget。不過(guò),這需要轉(zhuǎn)換若干結(jié)構(gòu)并提供接口,Win32的ImageList管理機(jī)制和SWT的Image包裝方法差別比較大,使得這種方法實(shí)現(xiàn)起來(lái)麻煩的多。

          posted on 2006-07-06 10:08 TreeNode 閱讀(2347) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): SWT,JFace和RCP

          Feedback

          # re: 在SWT中實(shí)現(xiàn)自繪Combo 2007-02-08 20:40 催月淚
          treenode前輩:你好

          在eclipse中國(guó)社區(qū)看了你的幾篇文章,我好生佩服你.我在你的自定義控件的兩篇文章中都看到了import org.eclipse.swt.internal.win32.這個(gè)包,但是我在eclipse3.2的API文檔中怎么也找到相關(guān)的說(shuō)明,在google中也搜索不到有用的信息.我找你找了好久,并且在eclipse中國(guó)社區(qū)發(fā)了尋人啟示貼,但都沒(méi)有回音,今天終于找到你的BLOG了.我很高興.
          我想請(qǐng)教一下,關(guān)于這個(gè)包那里相關(guān)的資料呢?如果可以的話,您能不能給我一些.

          不勝感激!

          gaojinglin@gmail.com
          催月淚 西安
          2007.2.8  回復(fù)  更多評(píng)論
            

          # re: 在SWT中實(shí)現(xiàn)自繪Combo[未登錄](méi) 2007-02-08 22:07 treenode
          文檔里是沒(méi)有寫(xiě)的,因?yàn)檫@是SWT的內(nèi)部實(shí)現(xiàn)。你從Eclipse網(wǎng)站上下載SWT源代碼包,打開(kāi)以后就可以找到這些包和所有代碼,里面實(shí)現(xiàn)了什么則需要自己去研究。

            回復(fù)  更多評(píng)論
            

          # re: 在SWT中實(shí)現(xiàn)自繪Combo 2007-02-09 23:15 催月淚
          哦!原來(lái)如此,看的出來(lái)前輩你是研究過(guò)SWT源代碼的,真是不簡(jiǎn)單。
          對(duì)于WIN32SDK我只有淺薄的基礎(chǔ),在閱讀SWT源代碼一定會(huì)很不適應(yīng),所以今后我一定會(huì)常來(lái)這里的。
          謝謝!非常感謝前輩指點(diǎn)
            回復(fù)  更多評(píng)論
            

          # re: 在SWT中實(shí)現(xiàn)自繪Combo[未登錄](méi) 2013-05-14 00:51 振興
          你好,我用了你寫(xiě)的這個(gè)代碼,但是報(bào):java.lang.SecurityException: class "org.eclipse.swt.widgets.CustomComboDemo"'s signer information does not match signer information of other classes in the same package,這是為什么呢,幫忙看一下可以嗎,不勝感激  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 金湖县| 平舆县| 朝阳县| 遂川县| 林周县| 神池县| 博客| 漠河县| 巨鹿县| 丹东市| 禄丰县| 西林县| 淄博市| 肇源县| 深水埗区| 油尖旺区| 彭水| 张家界市| 沙湾县| 罗源县| 成武县| 嘉义市| 集安市| 云阳县| 蒲城县| 双鸭山市| 方城县| 洛南县| 舒兰市| 和林格尔县| 灵山县| 汉源县| 德江县| 盐边县| 黄冈市| 清丰县| 射阳县| 和静县| 望谟县| 凌源市| 永昌县|