问题标签 [dwm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 禁用 JFrame 中的背景绘图以正确显示 Aero (DWM) 效果
我在 Java 窗口上使用 Windows Vista/7 的 DWM 功能时遇到问题。我想让我的框架的背景使用 Aero 风格。执行此操作的 Windows API 由库DwmExtendFrameIntoClientArea
中的函数提供dwmapi
。我已经设法通过 JNA 正确调用了该过程,并且它完成了它应该做的事情(例如,您可以看到,在调整框架大小时,在下一次重新绘制之前,您会在尚未绘制的区域中看到适当的航空效果,见附图)。
但是在某个地方(我不知道在哪里)在 Aero 效果上绘制了背景并且效果丢失了。
我已经尝试过的:
- 使用
ContentPane
不透明度设置为的自定义false
- 将 the
LayeredPane
和 the的不透明度设置RootPane
为 false - 使用 a
Frame
而不是 aJFrame
- 将/的背景颜色设置
JFrame
为ContentPane
黑色/完全透明 - 使用
setLayersOpaque
及其自定义变体,有关更多详细信息,请参阅第一个答案
到目前为止,我无法成功删除该背景。它是 AWT/Swing 的限制吗?如何删除该背景或正确使用 Aero 效果?
非常感谢您的帮助。
截屏
这是一个没有任何内容的框架的屏幕截图,已将 RootPane、LayeredPane 和 ContentPane 的不透明度设置为 false。我在调整大小时很快做到了。您会看到效果已正确应用于 Java 尚未绘制的区域。
http://i55.tinypic.com/v614qo.png(作为一个新用户,我不能直接发布图像...)
奇怪的行为
经过进一步调查,我发现了以下奇怪的行为。如果窗口大小为 150x150 或以下,内容将透明显示。这对于普通的窗口组件来说是非常有问题的。如果您通过覆盖该方法直接在框架上paint()
绘制,则所有内容都是半透明的。此外,坐标系似乎有点偏离,它显示为 的零点JFrame
设置为窗口的实际零点。因此 Swing 尝试绘制到实际窗口边框所在的区域,然后当然不可见。
看到这个截图:http ://d-gfx.kognetwork.ch/java_aero_bug.png
示例代码
这是我使用的代码。
需要jna.jar
和platform.jar
。可从 JNA 主页获取。
c# - 防止 Registry.GetValue 溢出
我正在尝试使用以下方法获取 DWM colorizationColor:
Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\DWM").GetValue("ColorizationColor")
但是它返回-2144154163(实际值为2150813133)
我认为这是因为该值不能保留在 32 位 int 上……但是事件转换(或转换)到 int64 失败。
PD:这听起来像是一个容易回答的问题,但我找不到解决方案:(
windows - 在 Windows 7 下使用 DWM 扭曲窗口
Windows 7 在 DWM 中具有扭曲窗口的功能。我正在寻找有关如何使用这些功能(未记录)来扭曲任何窗口的信息。
在此先感谢您的帮助,
问候,
aero - Aero:如何在玻璃上绘制纯色(不透明)颜色?
使用 GDI+ 绘制各种颜色:
您会注意到玻璃上没有正确显示不透明的颜色:
如何在玻璃上绘制纯色?
您还会注意到,完全不透明的颜色会根据它的颜色进行不同的处理:
- 不透明黑色:完全透明
- 不透明颜色:部分透明
- 不透明白色:完全不透明
谁能指出我在桌面合成器上解释如何处理不同颜色的文档?
更新 3
您还会注意到它的FillRectangle
行为不同于FillEllipse
:
FillEllipse
with an opaque color 绘制不透明颜色FillRectangle
使用不透明颜色绘制部分(或完全)透明
请解释无意义的行为。
更新 4
Alwayslearning建议我更改合成模式。来自MSDN:
合成模式枚举
CompositingMode枚举指定渲染颜色如何与背景颜色组合。此枚举由Graphics
Graphics::GetCompositingMode
类的'Graphics::SetCompositingMode'方法使用。指定在渲染颜色时,将其与背景颜色混合。混合由正在渲染的颜色的 alpha 分量决定。
指定在呈现颜色时,它会覆盖背景颜色。此模式不能与 TextRenderingHintClearTypeGridFit 一起使用。
从 的描述来看CompositingModeSourceCopy
,这听起来不是我想要的选项。从它施加的限制来看,这听起来像是我想要的选择。并且在禁用合成或透明度的情况下,它不是我想要的选项,因为它执行SourceCopy,而不是SourceBlend:
幸运的是,这不是我必须考虑的邪恶,因为它不能解决我的实际问题。构建我的graphics
对象后,我尝试更改合成模式:
结果对输出没有影响:
笔记
- Win32 原生
- 不是 .NET(即本机)
- 不是 Winforms(即原生)
- GDI+(即原生)
也可以看看
gdi+ - GDI+:为什么 FillRectangle 在玻璃上是透明的,而 FillEllipse 是不透明的?
我在玻璃上画一个矩形和一个椭圆。
- 用椭圆绘图:它是不透明的
- 用矩形绘图:它不是不透明的
这里发生了什么?
您可以看到同样适用于其他颜色:
结论:为什么:
FillEllipse
用不透明的颜色绘制不透明的FillRectangle
用不透明颜色绘制部分透明
注意:这个问题几乎与我的另一个问题重复。
FillRectangle
除了这个问题侧重于和 之间的区别FillEllipse
- 而那个问题涉及*如何在玻璃上绘制不透明的颜色。
也可以看看
winapi - Windows Vista/7 玻璃完全破碎?
我正在尝试为应用程序获得媒体播放器玻璃效果,但我面临着各种障碍。是我,还是API?
我首先调用:
并将背景擦除为黑色:
一切都很好,直到我添加了一个编辑框。使用 EditBox,黑色文本出现的地方被玻璃代替。这个问题与 ComboBoxEx 等更高级的控件不成比例。那些开始看起来像一团糟。
这种方法的优点是 alpha 混合图像看起来不错。并逐渐融入玻璃。
编辑框的解决方案似乎是使用带有 LWA_COLORKEY 的 WS_EX_LAYERED 并使用一些可怕的颜色进行玻璃遮罩,并将背景擦除为该颜色。不幸的是,这破坏了其他事情。图标上的 alpha 混合看起来超级难看,阴影混合成放射性绿色,而且玻璃本身变得可点击,即使我在窗口上没有 WS_EX_TRANSPARENT 样式。
第三个建议是使用 GDI+ 进行自定义合成,但这似乎是一种不好的方法,因为 GDI+ 是一种软件回退,我找不到如何将 EditBox 或 ComboBoxEx 渲染为可用于合成的图像的方法之后。
我错过了什么吗?
vb.net - 如何在无边框的 Windows 窗体上获得 Aero Glass?
我正在尝试使用 DWM API 在 VB.NET 2010 应用程序中的表单中查看 Aero Glass,但正如函数调用所建议的那样,它将 Frame 的外观扩展到客户区域,如果表单没有边框,则不会发生任何事情并形成将变得不可见。那么,我可以得到无边框形式的 Aero 玻璃...... ??
delphi - Delphi:如何以相反的顺序删除子类?
Mike Lischke 的TThemeServices
子类Application.Handle
,以便它可以WM_THEMECHANGED
在主题更改时接收来自 Windows(即)的广播通知。
它继承了Application
对象的窗口:
子类化的窗口过程然后按照它应该的那样发送WM_DESTROY
消息,删除它的子类,然后传递WM_DESTROY
消息:
该TThemeServices
对象是一个单例,在单元完成期间被销毁:
这一切都很好——只要 TThemeServices 是唯一一个将应用程序的句柄子类化的人。
我有一个类似的单例库,它也想挂钩Application.Handle
,这样我就可以接收广播:
当单元完成时,我的单例也同样被删除:
现在我们来解决这个问题。我不能保证某人可能选择访问ThemeServices
或的顺序DWM
,每个都应用他们的子类。我也不知道德尔福最终确定单位的顺序。
子类以错误的顺序被删除,并且应用程序关闭时发生崩溃。
怎么修?我如何确保我的子类化方法保持足够长的时间,直到其他人在我完成后完成?(毕竟我不想泄漏内存)
也可以看看
更新:我看到 Delphi 7 通过重写解决了这个错误TApplication
。><
呸呸呸
换句话说:尝试继承 TApplication 是一个错误,Borland 在采用 Mike 的TThemeManager
.
这很可能意味着没有办法以TApplication
相反的顺序删除子类。有人以答案的形式提出,我会接受。
c# - 如何模仿 Windows 7 UI?
我想尝试获得与 Windows 7 相同的外观,航空玻璃稍微下降一点,这样就可以有一个后退按钮/地址栏/搜索框。有没有关于如何做到这一点的教程?我真的需要一些简单的东西,因为我尝试查看其他一些试图解释如何将 DWM 与 c# 一起使用的教程,但我完全迷失了方向。
c# - 为什么我可以点击我的表单?
我正在试验并试图弄清楚 DWM 和 Windows Aero。到目前为止,我认为我几乎拥有它,除了一些奇怪的原因,当我点击表单的较厚部分时,我的点击直接穿过它,我不知道如何停止它。