alt text

我继承了仅在 Windows 上运行的 Java/SWT 应用程序的开发。我需要确定的功能请求之一是使用 Google-chrome 类型的标题栏来代替 SWT Windows 标题栏。应用程序的选项卡与窗口控制按钮出现在同一级别。

我的理解是我需要:

  • 编写一个能够呈现自定义外观并管理选项卡(而不是菜单)的 Windows 小部件。
  • 将 Windows 小部件公开为 dll,以便通过 JNI 在 Java 中使用
  • 编写一个自定义 SWT 小部件来包装它并公开选项卡管理界面。

我在 Java 编程、使用 Swing/AWT 进行 GUI 编程以及非 GUI C# 编程方面拥有丰富的经验。Windows GUI 编程和 SWT 对我来说是新的,所以我不知道从哪里开始。迄今为止我找到的最好的文章是 2001 年的一篇文章 编写您自己的 SWT 小部件.

我最大的未知数是实现自定义 Windows 应用程序窗口的最佳方法。

有帮助吗?

解决方案

您可以创建一个不带 TITLE 标志的 Shell 实例,然后手动渲染类似 Google Chrome 的选项卡。这样你甚至可以创建一个 非矩形窗户

其他提示

当处理尚未在 SWT JNI 层中的事物时,您应该始终记住,您可以使用以下命令快速原型化事物 JNA. 。当使用 JNA 原型时,您可以扩展 SWT 的本机接口或创建您自己的单独的 JNI 层(在处理 SWT Carbon/Cocoa 小部件时,这种方法多次对我来说效果很好)

我建议创建一个没有 Trim 的 shell,如下所示:

new Shell (display, SWT.NO_TRIM);

这将创建一个没有标题栏的外壳。随后,您可以制作自己的关闭/最小化/最大化按钮。

这是一个生成一个没有标题栏业务的单独进度条的示例。

enter image description here

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;

public class ProgressBarGui {

    Display display;
    Shell shell;

    public static void main (String [] args) {
        final Display display = new Display ();
        final Shell shell = new Shell (display, SWT.NO_TRIM);


        //Something to put into shell.
        shell.setLayout (new FormLayout ());

        ProgressBar proBar = new ProgressBar (shell, SWT.SMOOTH);
        proBar.setSelection (50);
        FormData progBarData = new FormData (100, 20);
        progBarData.top = new FormAttachment (0);
        progBarData.left = new FormAttachment (0);
        proBar.setLayoutData (progBarData);

        //recompute shell's size and position to fit widget.
        shell.pack ();

        shell.open ();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ())
                display.sleep ();
        }
        // region.dispose();
        display.dispose ();
    }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top