65.9K
CodeProject 正在变化。 阅读更多。
Home

掌控您的非客户区!

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.36/5 (11投票s)

2008年6月1日

CPOL

3分钟阅读

viewsIcon

49646

downloadIcon

1799

了解如何控制您的非客户端区域,同时保留 Vista 添加的所有内容。

MyBar

引言

微软似乎总是在 Office 等程序中添加一些时髦的新功能。然后,其他所有开发人员都会争相自己动手,销售控件等等。嗯,市面上有很多功能强大的 Ribbon 控件,但有一件事似乎都被大家忽略了。您无法在标题栏上绘图。那么……微软和那些 UserControl 制造商是怎么做到的呢?我想知道,因为我需要在标题栏上放置一些东西。我能想到的所有东西都搜索了一遍,最终找到了一篇关于这个主题的有趣的 C++ 文章。大约一周后,我写出了完成这项工作的六行代码。您可能想不到 6 行代码 = 1 周的时间吧?所以,我想,您现在一定想制作炫酷的标题栏了吧,我现在就开始吧……

背景

本文假定您和最终用户都拥有支持 Aero Glass 的 Vista 系统。代码中没有检查这方面的内容,甚至没有检查您是否拥有 Vista。我不知道在 XP 上尝试会发生什么。最复杂的部分是七行的 WndProc,但我们不会过多关注 WinAPI。相反,我将帮助您解决由此产生的各种问题。

使用代码

要将此功能添加到您自己的应用程序中,只需按照下面的教程操作即可。

打开(或创建一个新的)项目。如果是一个新项目,请选择 Windows Forms 应用程序。在一切加载完成后,单击一次您的窗体。在“属性”窗口中将 BackColor 设置为 Black。这可以使其呈现玻璃效果。现在,添加对 Vista Controls Library 的引用。它在 CodePlex 上,并且包含在我上面的项目 zip 中。返回窗体编辑器,将您的 FormBorderStyle 设置为 None。在窗体的 Loaded 事件中,添加 FormName.formborderstyle = System.Windows.Forms.FormBorderStyle.FixedSingle。在 FormLoad 事件中,进入新的一行,并添加以下代码: 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)必须以某种方式扩展窗口的玻璃效果,才能控制非客户端区域。

另外,一旦你知道如何操作,所需的代码量如此之少,这真是太奇怪了。

历史

无…… 目前还没有。

© . All rights reserved.