<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 閱讀(5362) 評論(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

    搜索

    積分與排名

    最新評論

    主站蜘蛛池模板: 亚洲天堂一区二区三区四区| 亚洲国语精品自产拍在线观看| 亚洲精品国产第1页| a级成人毛片免费视频高清| 国产中文在线亚洲精品官网| 精品久久久久久亚洲综合网| 国产三级免费观看| 国产精品亚洲一区二区无码| 国产精品免费小视频| 羞羞漫画登录页面免费| 免费亚洲视频在线观看| 一级特黄特色的免费大片视频| 国产亚洲精品激情都市| 免费日本一区二区| 亚洲电影在线免费观看| 成年人免费观看视频网站| 麻豆69堂免费视频| 人人狠狠综合久久亚洲88| 99热在线免费播放| 在线观看亚洲AV每日更新无码 | 久99久精品免费视频热77| 亚洲国产一区国产亚洲| 2021久久精品免费观看| 亚洲aⅴ无码专区在线观看春色| 亚洲精品专区在线观看| 久久成人无码国产免费播放| 亚洲AV无码乱码麻豆精品国产| 国产成人高清精品免费鸭子 | 在线免费观看一区二区三区| 污污视频免费观看网站| 亚洲爆乳无码专区| 成人性生免费视频| 成人性做爰aaa片免费看| 亚洲一区在线视频| 亚洲视频在线免费| 最近中文字幕mv免费高清在线 | 巨胸喷奶水视频www网免费| a一级爱做片免费| 亚洲国产成人在线视频| 亚洲Aⅴ无码一区二区二三区软件| 性无码免费一区二区三区在线 |