【发布时间】:2010-12-17 01:35:20
【问题描述】:
我正在尝试编写一个小型应用程序,但我希望整个窗口都是玻璃,上面有按钮和标签。是否可以在 Java 中做到这一点?
【问题讨论】:
标签: java aero aero-glass
我正在尝试编写一个小型应用程序,但我希望整个窗口都是玻璃,上面有按钮和标签。是否可以在 Java 中做到这一点?
【问题讨论】:
标签: java aero aero-glass
当然,此功能高度依赖于平台(在本例中为 Windows),因此需要 JNI。
假设您已经检查了玻璃窗是否已启用。步骤是:
步骤 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 版本。
【讨论】:
假设 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# 的文章。这应该让你开始。
【讨论】:
嗯。我认为所有Java GUI 都必须直接或间接地显示在Window 中,这是一个重量级组件。不确定是否可以使其透明/半透明。
尝试构建一个 JFrame 并将其背景颜色设置为 new Color(255, 255, 255, 20) 左右,其中 20 是 alpha。这应该使其大部分透明 - 或者它不会工作。
【讨论】: