WinForms 应用程序中的自定义标题栏/镶边

Posted

技术标签:

【中文标题】WinForms 应用程序中的自定义标题栏/镶边【英文标题】:Custom titlebars/chrome in a WinForms app 【发布时间】:2010-09-07 17:35:54 【问题描述】:

我几乎可以肯定我知道这个问题的答案,但我希望我忽略了一些东西。

即使在 Windows XP 上运行,某些应用程序的标题栏和按钮似乎也具有 Vista Aero 的外观和感觉。 (以 Google Chrome 和 Windows Live 照片库为例。)我知道从 WinForms 完成此操作的一种方法是创建一个无边框表单并自己绘制标题栏/按钮,然后覆盖 WndProc 以确保移动,调整大小和按钮点击做他们应该做的事情(我不清楚具体细节,但可能会在一天阅读文档的情况下完成它。)我很好奇是否有一种不同的、更简单的方法,我我俯瞰。也许我忽略了一些 API 调用或窗口样式?

我相信 Google 已经通过在 Chrome 中使用 roll-your-own-window 方法为我解答了这个问题。如果有人有新信息,我会将问题留待一天,但我相信我自己已经回答了这个问题。

【问题讨论】:

【参考方案1】:

这是一篇包含完整代码示例的文章,介绍了如何为应用程序使用您自己的自定义“chrome”:

http://geekswithblogs.net/kobush/articles/CustomBorderForms3.aspx

这看起来是一些非常好的东西。它的系列共有 3 篇文章,运行良好,而且在 Vista 上也是如此!

【讨论】:

我不久前自己发现了这个博客,但忘记将它添加到这个问题中。这是最接近这个问题在没有完整源样本的情况下真正可以得到的答案,而且它最终会非常大。 第一篇解释的概念很好。对非 .Net 开发人员也很有用 - geekswithblogs.net/kobush/articles/CustomBorderForms.aspx 我用过这个,我可以告诉你这是一个很好的方法,但是它在Vista中出现了问题,我认为程序员不会继续开发它,所以你可以找到一些错误。跨度> @user1306322 这篇文章中的链接仍然有效。 嗯。现在它正在工作。之前有一些错误。谢谢你让我知道。不过,如果您复制一些核心摘录以防将来无法使用,那会很酷。【参考方案2】:

Google Chrome使用 Vista SDK 在 XP 上实现此目的。如果您查看src\chrome\browser\views\frame,有几个文件可以根据系统的功能定义浏览器框架。在 XP 上,似乎使用了 OpaqueFrame;第 19 行是这样说的:

// OpaqueFrame
//
//  OpaqueFrame is a CustomFrameWindow subclass that in conjunction with
//  OpaqueNonClientView provides the window frame on Windows XP and on Windows
//  Vista when DWM desktop compositing is disabled. The window title and
//  borders are provided with bitmaps.

看起来它正在使用src\chrome\app\theme 中的资源来绘制框架按钮。

所以看起来我希望有某种廉价的方法可以在 XP 上启用 Vista 主题的希望破灭了。唯一的方法是手动绘制窗口的非客户区。我相信something like this 可能是正确的轨道,因为它让 Windows 处理非客户端的事情,比如移动和调整窗口大小。

除非有人能找到在 XP 上神奇地启用 Vista 主题的方法,否则这是问题的答案,但我显然无法将自己的帖子标记为答案。

【讨论】:

【参考方案3】:

Owen,我在 XP 上使用 Chrome,但在 Chrome 窗口上看不到“Vista Aero”玻璃主题。我认为它是纯蓝色的。

如果它是您想要的控件和窗口标题栏的自定义主题,则可以实现。有一个优秀的、免费的 WinForms UI 工具包可以做到这一点:KryptonToolkit

【讨论】:

【参考方案4】:

不,恐怕没有其他简单的方法可以做到这一点。

你在正确的轨道上。您将需要创建一个自定义 Winform,然后按照example 中的说明进行操作。

【讨论】:

【参考方案5】:

Google Chrome 使用 Windows Vista SDK 在 XP 上获得玻璃外观。你可以在这里下载:

http://www.microsoft.com/downloads/details.aspx?FamilyID=4377f86d-c913-4b5c-b87e-ef72e5b4e065&displaylang=en

使用此功能,您需要启用延迟加载以下 DLL 以获得 XP 中的玻璃效果:

uxtheme.dll dwmapi.dl

【讨论】:

这是错误的。请参阅我 9 月 4 日的帖子;谷歌浏览器使用@Chris Pietschmann 指出的一种技术。【参考方案6】:

@Jonathan Holland:这可以通过 .NET 完成吗?

是的,使用 DllImport。 Here 是一篇不错的博文

【讨论】:

真正巧妙的是,后来证明与答案完全无关的评论如何获得相当高的投票。这不是我的问题的答案。

以上是关于WinForms 应用程序中的自定义标题栏/镶边的主要内容,如果未能解决你的问题,请参考以下文章

MonoTouch 中的自定义标签栏项目

添加列的自定义 WinForms DataGridView 问题

将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用

滚动 - 单击时无法滚动固定侧边栏中的自定义滚动

地图注释的自定义标题

winforms 应用程序中的查询设计器