<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    treenode

    在路上。

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

    上一次,我實(shí)現(xiàn)了一個(gè)自繪的按鈕。現(xiàn)在,看到有人詢問是否可以在Combo的列表中加入圖像。其實(shí)這相當(dāng)容易,只要重載Combo Widget并把自繪接口暴露出來即可。以下是簡(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;
    }


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

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

    posted on 2006-07-06 10:08 TreeNode 閱讀(2345) 評(píng)論(4)  編輯  收藏 所屬分類: 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)的說明,在google中也搜索不到有用的信息.我找你找了好久,并且在eclipse中國(guó)社區(qū)發(fā)了尋人啟示貼,但都沒有回音,今天終于找到你的BLOG了.我很高興.
    我想請(qǐng)教一下,關(guān)于這個(gè)包那里相關(guān)的資料呢?如果可以的話,您能不能給我一些.

    不勝感激!

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

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

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

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

    # re: 在SWT中實(shí)現(xiàn)自繪Combo[未登錄] 2013-05-14 00:51 振興
    你好,我用了你寫的這個(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)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 两个人的视频www免费| 午夜亚洲乱码伦小说区69堂| 麻豆精品不卡国产免费看| 亚洲人成影院在线无码观看| 久久综合亚洲色hezyo| 国产精品久久久久影院免费| 亚洲色偷偷综合亚洲AV伊人蜜桃| 特级做A爰片毛片免费69| 国产精品亚洲片在线va| 国产又黄又爽又猛免费app| 亚洲国语在线视频手机在线| 国产麻豆视频免费观看| 亚洲欧美日韩中文字幕一区二区三区 | 国产精品久久免费视频| 精品亚洲视频在线| 一区二区三区亚洲视频| 中文字幕免费在线视频| 亚洲国产精品lv| 黄色片在线免费观看| 亚洲人AV在线无码影院观看| www.亚洲色图.com| 免费av片在线观看网站| 亚洲国产日韩在线| 国产一级淫片视频免费看| 中文字幕免费观看视频| 亚洲成AV人片久久| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 亚洲人成影院在线观看 | 亚洲欧美第一成人网站7777| 亚洲福利中文字幕在线网址| 国产一级a毛一级a看免费人娇| 无码专区—VA亚洲V天堂| 我要看免费的毛片| 波霸在线精品视频免费观看| 亚洲精品国产专区91在线| 国产精品自在自线免费观看| 国产精品综合专区中文字幕免费播放| 亚洲av综合av一区| 日本特黄特黄刺激大片免费| 国产一级淫片a免费播放口| 国产亚洲精品bv在线观看|