我正在使用纯Direct2D和C#与SharpDX构建UI。 这个用户界面是用户友好和美观,同时效率高。
为了演示,我使用 hacky 未记录的API(请参阅this question)构建了一个原型,但我绝不打算使用它进行生产,向后兼容首要原因是:
var accent = new User32.AccentPolicy { AccentState = AccentState };
int accentStructSize = Marshal.SizeOf(accent);
// allocate space for the struct
IntPtr accentPtr = Marshal.AllocHGlobal(accentStructSize);
Marshal.StructureToPtr(accent, accentPtr, false);
// set composition data
var data = new User32.WindowCompositionAttributeData {
Attribute = User32.WindowCompositionAttribute.WCA_ACCENT_POLICY,
SizeOfData = accentStructSize,
Data = accentPtr
};
// change window composition attributes and release resources
User32.SetWindowCompositionAttribute(Handle, ref data);
Marshal.FreeHGlobal(accentPtr);
我知道对此的即时响应是使用WPF,但我完全限于原始 Direct2D调用,因为我打算将所有UI逻辑移动到DLL以便注入DirectX应用程序(虽然不确定我将如何执行此操作,但不在此问题的范围内。)
在Windows 8.1上,有DirectComposition,可在透明窗口之上实现高效的alpha混合。
但Windows Vista和7中没有这样的东西(即使使用平台更新)。
有没有办法可以使用纯的非 hacky Direct2D / DirectX代码来使这个UI在所有Windows版本(最好是Vista SP2以上版本)上运行?