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

自定义窗口的非客户端区域

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.15/5 (8投票s)

2005年10月9日

CPOL

5分钟阅读

viewsIcon

55476

downloadIcon

3127

Visual Basic 几乎无法自定义客户端区域之外的窗口;现在您至少有了一种方法。

screenshot.jpg

引言

Visual Basic 窗口的非客户区包括边框、标题栏、菜单栏、系统菜单图标以及非客户区和客户区之间的一些间距。客户端区域就是您放置控件的空间。该项目让您可以同样控制非客户区,并且仅限于非 MDI 窗口。因此,它不适用于 MDI 窗体或 MDI 子窗体。

通过附带的代码,您可以轻松设定窗口的任何外观。聚焦/活动窗口和失焦/非活动窗口的外观完全分开处理,使您能够自定义两种状态下的窗口。下载文件中都提供了已编译的 *.hlp 文件,以帮助您浏览 100 多个方法和属性。

工作原理

该项目通过控制两个关键进程来实现这一壮举。

首先,客户端区域被修改并移动,为非客户区腾出空间。理论上,这很简单。我们预先测量所有将进入非客户区的内容,通过从预留给非客户区的空间中减去可用的窗口空间来计算客户端区域,然后将客户端区域相对于窗口移动到适当的左上角坐标。

其次,当收到特定的窗口消息时,Visual Basic 会覆盖我们的工作,绘制它认为是的消息。

我无法考虑您可能想要实现的所有自定义场景。因此,该 DLL 可以被视为一个标准的非客户区绘制器。但是,通过使用已实现的类作为回调,内置的功能允许用户自定义非客户区,超出 DLL 的能力范围。您可以通过回调请求 DLL 将部分或大部分绘制责任移交给您的代码。我认为 DLL 的可扩展性是它最强大的“卖点”之一。

标题栏

标题栏相当直接,整体呈矩形。它可以放置在矩形窗口的 4 条边上的任何位置。当放置在左边缘或右边缘时,如果可能,字体将是垂直的。使用 TTF 字体。由于我们控制着非客户区,我们可以做一些事情,比如在标题栏上添加额外的按钮,带或不带工具提示,按照我们的意愿排列按钮,换行标题栏标题,以及简单地切换其可见性。垂直标题栏没有“规则”,所以我创建了一些:典型的系统按钮将靠近窗口的外部边缘;所有按钮都将位于窗口的顶部而不是底部;系统图标将保留在标题栏标题的开头附近。放在窗口底部附近,当窗体很大/最大化时,看起来会很奇怪,因为系统图标可能离标题栏很远。

菜单栏

菜单栏与标题栏非常相似,基本上是矩形的。但是,拦截消息以模仿真实菜单栏行为很复杂。同样,VB 会在处理特定消息时尝试绘制菜单栏或其一部分。该项目不直接在菜单栏上绘制图像,该功能通过类实现传递给用户。由于我们控制着外观,我们可以做一些简单的事情,比如隐藏禁用的菜单项,更改字体样式和颜色,格式化或塑造选定或悬停的菜单项周围的边框。菜单栏也可以靠近窗口顶部或底部对齐。

内嵌(非客户区内创建的额外空间)

非客户区周围不包含菜单栏或标题栏的剩余区域,也可以进行修改,以在非客户区提供更多空间。这个额外的空间就像客户区的一个框架。您可以使用这个额外的空间来显示自定义大小的边框、自定义背景、添加文本或其他图像。该项目可以转发您与放置在非客户区上的其他对象相关的鼠标操作(称为跟踪矩形)。下载中的一个示例添加了一些模仿到非客户区链接的文本。当鼠标悬停在文本上时,光标会改变,文本颜色也会改变。当您单击文本时,您会跳转到一个网站。

闭运算

还包含了几种其他小型项目,因此该 DLL 希望能够被认为是独立的。其他一些项目包括窗口大小限制、系统托盘图标、其他子窗口的子类化、导入/导出自定义设置,以及一个永远不会被 DLL 调用且仅用于帮助编码器处理常见图形/GDI 相关任务的图形类。

已提供完整的源代码。解压缩附件时,请确保使用“使用文件夹名称”选项,然后简单地打开 *.vbg 文件即可开始。满意后,您可以选择编译 DLL。单独的 zip 文件中提供了一个已编译的 DLL,如果您宁愿使用 Visual Studio 编译自己的 DLL,则应该自行注册它,或者通过引用页面或“浏览”按钮从您的项目(名为 LaVolpe Custom Windows II)中引用它。

该项目已在 98、2K、XP、NT4(近期)上进行了测试。它已通过本网站和其他网站下载了数千次。因此,可以假设它也经过了 ME 和 95 的测试。如果您发现错误或有改进的强烈建议,请给我发个消息。

© . All rights reserved.