Chrome Style C#应用程序?

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

你需要做一些Win32互操作才能达到这个效果。 根据您使用的是Winforms还是WPF,您挂钩到消息处理的方式不同(我不记得Winforms,所以我将为WPF提供所有示例)。 但在这两种情况下,您需要:

  1. 拦截窗口的创建并修改窗口样式和扩展样式。 在WPF中,您需要从HwndSourceinheritance并修改HwndSourceParameters以实现此目的。 对于常规样式和WS_EX_WINDOWEDGE以及WS_EX_APPWINDOW扩展样式,您需要WS_OVERLAPPEDWINDOW,WS_CLIPSIBLINGS和WS_VISIBLE。

  2. 通过HwndSource参数HwndSourceHook添加消息处理程序。

  3. 在通过第二步中的钩子添加的消息proc中,您需要处理几条消息:

    • WM_NCACTIVATE – 在应用程序激活时更改标题的绘制
    • WM_NCCALCSIZE – 返回到您没有非客户区域的操作系统
    • WM_NCPAINT – 一般来说,你只需要在这里设置窗口矩形,WPF将负责实际的绘画)
    • WM_NCHITTEST – 处理窗口的移动,最小化和最大化。
  4. 完成上述操作后,WPF将绘制可视树的客户区将跨越窗口的整个区域。 您需要添加“非cliet”视觉效果,以便您的应用程序看起来像是用户的常规应用程序。

  5. 您可能还需要更多消息:

    • 如果要将“非客户”区域绘制更改为与OS主题一致,则WM_THEMECHANGED
    • WM_DWMCOMPOSITIONCHANGED如果你想延长玻璃并在启用玻璃时获得标准的OS NC玻璃画,并在没有玻璃时切换到自定义逻辑。
  6. 如果你想获得边界,标题,关闭,最小化和最大化按钮以在“非客户”区域中使用的标准Win32资源,你可能想要查看Win32主题API。

  7. 如果您想将Glass扩展到窗口,可以查看:

    • DwmExtendFrameIntoClientArea – 获取标准玻璃NC区域
    • DwmDefWindowProc – 让桌面管理器绘制Glass和标准NC控件
    • DwmIsCompositionEnabled – 确定是否启用了Glass; 只有在启用Glass时才能使用上述两个API。 如果未启用Glass,则需要自己绘制NC区域。

您可以在P / Invoke上找到所需的所有消息,样式和相应的Win32 API的正确C#定义。

通过使用WindowStyle=none标准WPF窗口,您也可以获得类似的效果。 但是,桌面对您的应用和其他应用的行为之间会有一些差异; 最明显的是,您无法通过右键单击任务栏来堆叠或平铺窗口。

您还可以查看一些启用此function的第三方组件。 我没有使用任何(你可以看到,我不害怕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

我使用DotNetBar控件套件取得了很好的成功。