Tag: dwm

禁用JFrame中的背景绘图以正确显示Aero(DWM)效果

我在Java窗口上使用Windows Vista / 7的DWMfunction时遇到问题。 我想让我的画面背景使用Aero风格。 执行此操作的Windows API由dwmapi库中的函数DwmExtendFrameIntoClientArea提供。 我已经设法通过JNA正确调用该程序,它完成了它应该做的事情(你可以看到,例如在调整框架大小时,在下一次重绘之前,你会看到尚未绘制的区域中的正确的空气动力效果,见附图)。 但某处(我无法弄清楚在哪里)背景被涂在Aero效果上并且效果丢失了。 我已经尝试过: 使用不透明度设置为false的自定义ContentPane 将LayeredPane和RootPane的不透明度设置为false 使用Frame而不是JFrame 将JFrame / ContentPane的背景颜色设置为黑色/完全透明 使用setLayersOpaque及其自定义变体,请参阅第一个答案以获取更多详细信息 到目前为止,我无法成功删除该背景。 这是AWT / Swing的限制吗? 如何删除该背景或正确使用Aero效果? 非常感谢您的帮助。 截图 这里是没有任何内容的框架的屏幕截图,将RootPane,LayeredPane和ContentPane的不透明度设置为false。 我在resize时快速完成了。 您会看到效果已正确应用于Java尚未绘制的区域。 http://sofzh.miximages.com/java/v614qo.png (作为新用户,我无法直接发布图片…) 奇怪的行为 经过进一步调查,我发现了以下奇怪的行为。 如果窗口大小为150×150或更低,则内容将以透明方式显示。 这对于普通窗口组件来说非常小问题。 如果通过覆盖paint()方法直接在框架上绘制,则所有内容都是半透明的。 此外,坐标系似乎有点偏离,它显示为JFrame的零点设置为窗口的实际零点。 因此,Swing尝试绘制到实际上窗口边界所在的区域,然后当然不可见。 请参见此屏幕截图: http : //d-gfx.kognetwork.ch/java_aero_bug.png 示例代码 这是我使用的代码。 需要jna.jar和platform.jar 。 可从JNA主页获得。 import com.sun.jna.Function; import com.sun.jna.Native; import com.sun.jna.NativeLibrary; import com.sun.jna.Structure; import com.sun.jna.platform.win32.WinDef.HWND; […]