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

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

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

    gr8vyguy@Blogjava

    如何在標題欄上加一個問號按鈕

    Windows系統中用以激活上下文幫助的有兩種方式,
        1. F1,
        2. 標題欄上的問號按鈕.
    helpbutton.gif

    SWT支持第一種方式。只要對一個控件加上SWT.Help事件的Listener就可以了。

    我卻沒有找到怎樣在標題欄上加上一個問號的方法。只好借助JNI了,先查需要哪個Win32 API的函數。那是
    SetWindowLong(hWnd,  GWL_EXSTYLE,  WS_EX_CONTEXTHELP)函數,其中hWnd是對話框的句柄,WS_EX_CONTEXTHELP激活了上下文問號按鈕.  然后了我們可以定義一個Java  Native的方法以及相應的C函數, 并把C函數做成一個DLL的庫, 從Java中調用SetWindowLong以激活問號按鈕。

    幸運的是SWT已經為我們作了大部分工作了,org.eclipse.swt.internal.win32.OS類中已經定義了SetWindowLong函數, 也就是說我們不需要自己寫JNI的接口.  當然OS類位于一個internal的包了, internal包里的類要謹慎使用. 另外即使在SWT的CVS庫里也沒有定義WS_EX_CONTEXTHELP這個常數, 這說明SWT目前還不支持標題欄上的問號按鈕, 可能是因為其他的窗口系統下不支持的緣故.在這篇里,我只考慮Windows的情況.

    在我們寫代碼之前,需要知道WS_EX_CONTEXTHELP具體的值, 查MSDN或者用VC++里的打開定義功能, 查到WS_EX_CONTEXTHELP = 0x400.

    public class HelpButton {

        
    public static final String HELP_TEXT = "HELP_TEXT";
        
    public static final String HELP_IMAGE = "HELP_IMAGE";

        
    private Shell parent;
        
    private Shell helpShell;
        
    private Label helpImageLabel;
        
    private Label helpTextLabel;

        
    private static final int WS_EX_CONTEXTHELP = 0x400;

        
    public HelpButton(Shell shell) {
            
    int style = OS.GetWindowLong(shell.handle, OS.GWL_EXSTYLE);
            OS.SetWindowLong(shell.handle, OS.GWL_EXSTYLE, style
                    
    | WS_EX_CONTEXTHELP);

            
    this.parent = shell;
            helpShell 
    = new Shell(parent, SWT.ON_TOP | SWT.TOOL);
            GridLayout gridLayout 
    = new GridLayout();
            gridLayout.numColumns 
    = 2;
            gridLayout.marginWidth 
    = 2;
            gridLayout.marginHeight 
    = 2;
            helpShell.setLayout(gridLayout);
            Display display 
    = shell.getDisplay();
            helpShell.setBackground(display
                    .getSystemColor(SWT.COLOR_INFO_BACKGROUND));

            helpImageLabel 
    = new Label(helpShell, SWT.NONE);
            helpImageLabel.setForeground(display
                    .getSystemColor(SWT.COLOR_INFO_FOREGROUND));
            helpImageLabel.setBackground(display
                    .getSystemColor(SWT.COLOR_INFO_BACKGROUND));
            helpImageLabel.setLayoutData(
    new GridData(GridData.FILL_HORIZONTAL
                    
    | GridData.VERTICAL_ALIGN_CENTER));

            helpTextLabel 
    = new Label(helpShell, SWT.NONE);
            helpTextLabel.setForeground(display
                    .getSystemColor(SWT.COLOR_INFO_FOREGROUND));
            helpTextLabel.setBackground(display
                    .getSystemColor(SWT.COLOR_INFO_BACKGROUND));
            helpTextLabel.setLayoutData(
    new GridData(GridData.FILL_HORIZONTAL
                    
    | GridData.VERTICAL_ALIGN_CENTER));

            Listener listener 
    = new Listener() {
                
    public void handleEvent(Event event) {
                    
    if (helpShell.isVisible())
                        helpShell.setVisible(
    false);
                }
            };
            helpTextLabel.addListener(SWT.MouseDown, listener);
            helpImageLabel.addListener(SWT.MouseDown, listener);
            parent.addListener(SWT.MouseDown, listener);
        }

        
    public void activeHelpListener(final Control control) {
            control.addListener(SWT.Help, 
    new Listener() {
                
    public void handleEvent(Event event) {
                    Control control 
    = (Control) event.widget;
                    String text 
    = control.getData(HELP_TEXT).toString();
                    Object img 
    = control.getData(HELP_IMAGE);
                    
    if (img instanceof Image) {
                        helpImageLabel.setImage((Image) img);
                    }
                    helpTextLabel.setText(text);
                    Rectangle controlRect 
    = control.getBounds();
                    Display display 
    = parent.getDisplay();
                    Point pt 
    = display.map(parent, null, control.getLocation());
                    helpShell.pack();
                    helpShell.setLocation(pt.x 
    + controlRect.width / 2, pt.y
                            
    + controlRect.height / 2);
                    helpShell.setVisible(
    true);
                }
            });
        }
    }

    測試程序
    public class HelpButtonTest {

        
    public static void main(String[] args) {
            
    final Display display = new Display();
            
    final Shell shell = new Shell(display, SWT.DIALOG_TRIM);
            shell.setLayout(
    new RowLayout());
            HelpButton helpButton 
    = new HelpButton(shell);
            
            Button button 
    = new Button(shell, SWT.PUSH);
            button.setText(
    "Button");
            helpButton.activeHelpListener(button);
            button.setData(HelpButton.HELP_TEXT, 
    "Click me to get 1 million EURO.");
            Image image 
    = new Image(display, HelpButtonTest.class
                    .getResourceAsStream(
    "information.gif"));
            button.setData(HelpButton.HELP_IMAGE, image);
            
            button 
    = new Button(shell, SWT.PUSH);
            button.setText(
    "Eclipse SWT");
            helpButton.activeHelpListener(button);
            button.setData(HelpButton.HELP_TEXT, 
    "Click me to get 100 million EURO.");
            image 
    = new Image(display, HelpButtonTest.class
                    .getResourceAsStream(
    "warning.gif"));
            button.setData(HelpButton.HELP_IMAGE, image);
            
            shell.setSize(
    200100);
            shell.open();
            
    while (!shell.isDisposed()) {
                
    if (!display.readAndDispatch())
                    display.sleep();
            }
            
    if (image != null)
                image.dispose();
            display.dispose();
        }
    }

    helpbutton1.gif


    轉載請保留http://www.tkk7.com/xilaile/archive/2007/02/23/100397.html

    posted on 2007-02-23 03:09 gr8vyguy 閱讀(5360) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: 如何在標題欄上加一個問號按鈕 2007-02-24 02:33 BeanSoft

    很實用的功能, 多謝!  回復  更多評論   

    <2007年2月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728123
    45678910

    導航

    統計

    公告

  • 轉載請注明出處.
  • msn: gr8vyguy at live.com
  • 常用鏈接

    留言簿(9)

    隨筆分類(68)

    隨筆檔案(80)

    文章分類(1)

    My Open Source Projects

    搜索

    積分與排名

    最新評論

    主站蜘蛛池模板: 亚洲午夜AV无码专区在线播放| AV在线亚洲男人的天堂| 国产精品亚洲片在线| 国产精品亚洲一区二区麻豆| 很黄很黄的网站免费的| 亚洲免费电影网站| 一二三四在线播放免费观看中文版视频| 成人a免费α片在线视频网站| 噼里啪啦电影在线观看免费高清| 在线观看免费成人| 亚洲熟妇无码一区二区三区| 24小时免费直播在线观看| 亚洲国产成人无码AV在线影院| 成人妇女免费播放久久久| 亚洲综合精品网站在线观看| 中文字幕免费在线播放| 久久精品国产亚洲AV麻豆王友容 | 亚洲国产精品人久久| 99re6在线精品免费观看| 亚洲国产成人久久综合碰碰动漫3d| 亚洲综合av一区二区三区不卡| 亚洲免费在线观看| 亚洲男人第一av网站| 亚洲精品国产免费| 亚洲爆乳AAA无码专区| 亚洲天堂在线视频| 91香焦国产线观看看免费| 麻豆狠色伊人亚洲综合网站| 国产老女人精品免费视频| 美女巨胸喷奶水视频www免费| 在线看片无码永久免费aⅴ| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 亚洲影视自拍揄拍愉拍| 国内外成人免费视频| 久久精品无码免费不卡| 亚洲图片激情小说| 亚洲а∨天堂久久精品| 久久国产精品成人片免费| 亚洲爆乳无码精品AAA片蜜桃| 台湾一级毛片永久免费| 色视频在线观看免费|