掌控您的非客户区!
了解如何控制您的非客户端区域,同时保留 Vista 添加的所有内容。
- 下载源代码 - 64.3 KB
如果您想要预编译的版本,请查看Debug文件夹。
引言
微软似乎总是在 Office 等程序中添加一些时髦的新功能。然后,其他所有开发人员都会争相自己动手,销售控件等等。嗯,市面上有很多功能强大的 Ribbon 控件,但有一件事似乎都被大家忽略了。您无法在标题栏上绘图。那么……微软和那些 UserControl 制造商是怎么做到的呢?我想知道,因为我需要在标题栏上放置一些东西。我能想到的所有东西都搜索了一遍,最终找到了一篇关于这个主题的有趣的 C++ 文章。大约一周后,我写出了完成这项工作的六行代码。您可能想不到 6 行代码 = 1 周的时间吧?所以,我想,您现在一定想制作炫酷的标题栏了吧,我现在就开始吧……
背景
本文假定您和最终用户都拥有支持 Aero Glass 的 Vista 系统。代码中没有检查这方面的内容,甚至没有检查您是否拥有 Vista。我不知道在 XP 上尝试会发生什么。最复杂的部分是七行的 WndProc
,但我们不会过多关注 WinAPI。相反,我将帮助您解决由此产生的各种问题。
使用代码
要将此功能添加到您自己的应用程序中,只需按照下面的教程操作即可。
打开(或创建一个新的)项目。如果是一个新项目,请选择 Windows Forms 应用程序。在一切加载完成后,单击一次您的窗体。在“属性”窗口中将 BackColor
设置为 Black。这可以使其呈现玻璃效果。现在,添加对 Vista Controls Library 的引用。它在 CodePlex 上,并且包含在我上面的项目 zip 中。返回窗体编辑器,将您的 Form
的 BorderStyle
设置为 None
。在窗体的 Loaded
事件中,添加 FormName.formborderstyle = System.Windows.Forms.FormBorderStyle.FixedSingle
。在 Form
的 Load
事件中,进入新的一行,并添加以下代码: VistaControls.DWM.DWMManager.EnableGlassSheet(Me)
。现在,最重要的一步。在 Public Class Formname
中,添加 Protected Overrides WndProc
并按 Enter。添加以下代码
If M.Msg = &H83 then
Dim point as new point(m.lparam.toint32)
m.result = new intptr(-1)
return
end if
将这段代码放在 MyBase.WndProc
**之前**。
现在,运行您的应用程序,您应该会看到一个没有标题栏、没有图标、无法拖动的窗体,并且标题栏按钮无响应。太棒了!
由于这是一篇中高级文章,我将不详细介绍所有内容(您可以在上面的解决方案中找到),而只介绍更困难或意想不到的部分。如果您需要我介绍我未涵盖的部分,请发表评论。如果项目尚未打开,您可能需要打开上面的项目作为参考。
首先,当点击最大化选项时,它会检查窗口是最小化、最大化还是正常状态。如果正常,它会最大化;否则,它会“正常化”回一个窗口。
其次,有一个名为 checkButtons
的计时器。它会检查最小化或最大化按钮是否被禁用,并禁用相应的按钮处理程序;但是,这是一种单向操作。一旦按钮处理程序被禁用,就无法重新启用。这里发生的情况是:
它会检查按钮是否存在,如果不存在,则将不存在的按钮的处理程序移出屏幕(将在下次更新时销毁)。
现在,这就是我让您将 BorderStyle
设置为 None
的原因。这是因为它可以更准确地显示您的窗体外观,因为 VB 不允许您在设计器中将内容放置在“标题栏”上。
请参考示例文件,了解我未涵盖的任何内容,如果您对示例中不理解的任何内容有疑问,请随时发表评论。
关注点
桌面窗口管理器(Desktop Window Manager)必须以某种方式扩展窗口的玻璃效果,才能控制非客户端区域。
另外,一旦你知道如何操作,所需的代码量如此之少,这真是太奇怪了。
历史
无…… 目前还没有。