【问题标题】:Chrome Style C# Applications?Chrome 风格的 C# 应用程序?
【发布时间】:2010-10-09 02:55:20
【问题描述】:

我不是在谈论 vista glass 功能,我已经知道如何实现它。我所说的功能是向标题栏添加控件,就像 office 2007 对徽标和工具栏所做的那样。

【问题讨论】:

    标签: c# windows-vista google-chrome


    【解决方案1】:

    你需要做一些 Win32 互操作来达到这个效果。根据您使用的是 Winforms 还是 WPF,您连接到消息处理的方式会有所不同(我不记得 Winforms,所以我将给出 WPF 的所有示例)。但在这两种情况下,您都需要:

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

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

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

      • WM_NCACTIVATE - 在应用启动或不启动时更改标题的绘画
      • WM_NCCALCSIZE - 返回没有非客户区的操作系统
      • WM_NCPAINT - 通常您只需要在此处使窗口矩形失效,WPF 将负责实际绘制)
      • WM_NCHITTEST - 处理窗口的移动,最小化和最大化。
    4. 完成上述操作后,WPF 将绘制可视化树的客户区将跨越整个窗口区域。您将需要添加“非客户端”视觉效果,以便您的应用程序在用户看来就像一个常规应用程序。

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

      • WM_THEMECHANGED如果你想改变你的“非客户”区域绘画以与操作系统主题保持一致
      • WM_DWMCOMPOSITIONCHANGED 如果您想扩展 glass 并在 glass 启用时获得标准 OS NC-glass 绘画,并在 glass 未启用时切换到您的自定义逻辑。
    6. 如果您想获取用于边框、标题、关闭、最小化和最大化按钮的标准 Win32 资源,以便在“非客户端”区域中使用,您可能需要查看 Win32 主题 API。

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

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

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

    您还可以查看一些启用此功能的第三方组件。我没有使用过任何(如你所见,我并不害怕 Win32 互操作 :-)),所以我不能特别推荐你。

    【讨论】:

    • 并非如此。我本来打算写一篇,但我一直没写,家里有 5 个月大的婴儿怎么办…… :-)
    【解决方案2】:

    正如 Franci 所提到的,您想要的是 DwmExtendFrameIntoClientArea。这是 Codeproject 中的一个示例,展示了如何做到这一点。

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

    【讨论】:

    • 请注意,当 Glass 关闭时,例如在 TS 下或当用户切换到 Vista basic 时,DwmExtendFrameIntoClientAre 将无法工作。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我已成功使用 DotNetBar 控件套件。

      【讨论】:

        猜你喜欢
        • 2010-10-08
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多