【问题标题】:How to make entire window aero glass in Java?如何用Java制作整个窗户的航空玻璃?
【发布时间】:2010-12-17 01:35:20
【问题描述】:

我正在尝试编写一个小型应用程序,但我希望整个窗口都是玻璃,上面有按钮和标签。是否可以在 Java 中做到这一点?

【问题讨论】:

    标签: java aero aero-glass


    【解决方案1】:

    当然,此功能高度依赖于平台(在本例中为 Windows),因此需要 JNI。

    假设您已经检查了玻璃窗是否已启用。步骤是:

    1. 确保窗口是分层的;
    2. 将玻璃框架延伸到客户区;
    3. 选择标识透明区域的颜色;
    4. 将该颜色设置为窗口背景。

    步骤 1-3 用 C 语言编写。让HWND hwnd 成为您要玻璃化的窗口的句柄,让COLORREF color 成为颜色(越不寻常,最好):

    // 1.
    SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
      SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
    // 2.
    MARGINS margins = {-1, -1, -1, -1};
    DwmExtendFrameIntoClientArea(hwnd, &margins);
    // 3.
    SetLayeredWindowAttributes(hwnd, color, 0, LWA_COLORKEY);
    

    第 4 步是简单的 Java,类似于

    window.getContentPane().setBackground(color);
    

    其中color 是之前选择的颜色的Java 版本。

    【讨论】:

      【解决方案2】:

      假设 Java SWT 和朋友没有对 Windows Aero 技术的内置支持,您将不得不通过 JNI 调用本机 API。您需要调用的本机 API 是

      DwmExtendFrameIntoClientArea(int windowHandle, MARGINS margins);
      

      此原生 API 位于 Windows Vista 和 Windows 7 的 DWMAPI.dll 原生库中,为 documented on MSDN

      网上有很多关于如何调用这个函数的文档。例如,这是一篇关于 doing this in C# 的文章。这应该让你开始。

      【讨论】:

      • 需要注意的是,SWT 有一些内部 API 用于调用 DwmExtendFrameIntoClientArea。这可能是解决这个问题的起点。
      【解决方案3】:

      嗯。我认为所有Java GUI 都必须直接或间接地显示在Window 中,这是一个重量级组件。不确定是否可以使其透明/半透明。

      尝试构建一个 JFrame 并将其背景颜色设置为 new Color(255, 255, 255, 20) 左右,其中 20 是 alpha。这应该使其大部分透明 - 或者它不会工作。

      【讨论】:

        猜你喜欢
        • 2011-08-03
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多