当前位置:  开发笔记 > 编程语言 > 正文

Chrome Style C#应用程序?

如何解决《ChromeStyleC#应用程序?》经验,为你挑选了3个好方法。

我不是在谈论远景玻璃功能,我已经知道如何实现这一目标.我正在谈论的功能是为标题栏添加控件,就像Office 2007对标识和工具栏一样.



1> Franci Penov..:

你需要做一些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互操作:-)),所以我不能推荐你任何特别的.



2> Erik Funkenb..:

正如Franci所提到的,你想要的是DwmExtendFrameIntoClientArea.这是Codeproject的一个示例,展示了如何执行此操作.

http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx



3> Shuft..:

WPF产品团队开发人员Joe Castro拥有一个名为"WPF Chrome"的MSDN代码库项目,可用于创建类似于Office 2007的UI(即:跨越窗口的客户端和非客户端区域的控件) ).

在这里找到它:http://code.msdn.microsoft.com/chrome

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有