我不是在谈论远景玻璃功能,我已经知道如何实现这一目标.我正在谈论的功能是为标题栏添加控件,就像Office 2007对标识和工具栏一样.
你需要做一些Win32互操作才能达到这个效果.根据您使用的是Winforms还是WPF,您挂钩到消息处理的方式不同(我不记得Winforms,所以我将为WPF提供所有示例).但在这两种情况下,您需要:
拦截窗口的创建并修改窗口样式和扩展样式.在WPF中,您需要继承HwndSource
并修改它HwndSourceParameters
才能实现此目的.对于常规样式和WS_EX_WINDOWEDGE以及WS_EX_APPWINDOW扩展样式,您需要WS_OVERLAPPEDWINDOW,WS_CLIPSIBLINGS和WS_VISIBLE.
通过HwndSource参数HwndSourceHook添加消息处理程序.
在通过第二步中的钩子添加的消息proc中,您需要处理几条消息:
WM_NCACTIVATE
- 在激活或不激活应用程序时更改标题的绘制
WM_NCCALCSIZE
- 返回到您没有非客户区域的操作系统
WM_NCPAINT
- 一般来说,你只需要在这里设置窗口矩形,WPF将负责实际的绘画)
WM_NCHITTEST
- 处理窗口的移动,最小化和最大化.
完成上述操作后,WPF将绘制可视树的客户区将跨越窗口的整个区域.您需要添加"非cliet"视觉效果,以便您的应用程序看起来像是用户的常规应用程序.
您可能还需要几条消息:
WM_THEMECHANGED
如果你想改变你的"非客户"区域绘画,以与操作系统主题保持一致
WM_DWMCOMPOSITIONCHANGED
如果你想延长玻璃并在启用玻璃时获得标准的OS NC玻璃画,并在没有玻璃时切换到自定义逻辑.
如果你想获得边界,标题,关闭,最小化和最大化按钮以在"非客户"区域中使用的标准Win32资源,你可能想要查看Win32主题API.
如果您想将Glass扩展到窗口中,可以查看:
DwmExtendFrameIntoClientArea
- 获得标准玻璃NC区域
DwmDefWindowProc
- 让桌面管理器绘制Glass和标准NC控件
DwmIsCompositionEnabled
- 确定Glass是否已启用; 只有在启用Glass时才能使用上述两个API.如果未启用Glass,则需要自己绘制NC区域.
您可以在P/Invoke上找到所需的所有消息,样式和相应的Win32 API的正确C#定义.
您也可以通过使用标准WPF窗口来实现类似的效果WindowStyle=none
.但是,桌面对您的应用和其他应用的行为会有一些差异; 最明显的是,您无法通过右键单击任务栏来堆叠或平铺窗口.
您还可以查看一些启用此功能的第三方组件.我没有使用任何(你可以看到,我不害怕Win32互操作:-)),所以我不能推荐你任何特别的.
正如Franci所提到的,你想要的是DwmExtendFrameIntoClientArea.这是Codeproject的一个示例,展示了如何执行此操作.
http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx
WPF产品团队开发人员Joe Castro拥有一个名为"WPF Chrome"的MSDN代码库项目,可用于创建类似于Office 2007的UI(即:跨越窗口的客户端和非客户端区域的控件) ).
在这里找到它:http://code.msdn.microsoft.com/chrome