纯 Win32 API 中的可滚动对话框






4.85/5 (37投票s)
在纯 Win32 API 中实现可滚动对话框的极简示例
图 1. 完全打开的对话框窗口。
图 2. 滚动对话框窗口。
引言
弹出对话框窗口是 Windows 世界中最常见的 GUI 元素之一。 每个人都知道如何使用 DialogBox
函数调用创建对话框。 同样,每个人都知道默认情况下弹出对话框既不能调整大小,也不能滚动。 不幸的是,没有一个很好的例子展示了如何在纯 Win32 API 中实现简单可调整大小和可滚动的对话框,而无需使用 MFC、ATL、WTL 等。 大多数示例都需要 MFC 或其他 GUI 框架。 本文演示了如何在纯 Win32 API 和 Windows 平台 SDK 中实现可滚动的对话框窗口。
背景
可滚动对话框背后的思想非常简单。 为了获得可滚动的对话框,需要做的所有事情总结如下:
- 在资源编辑器中为对话框指定可调整大小的边框,或者手动将
WS_THICKFRAME
样式添加到对话框模板。 - 启用对话框窗口的滚动条,或者将
WS_VSCROLL | WS_HSCROLL
样式添加到对话框窗口。 - 处理
WM_RESIZE
、WM_HSCROLL
和WM_VSCROLL
消息。
注意:对话框是可调整大小的,但是当前的示例不会根据对话框大小重新定位对话框控件。 如果需要根据窗口大小拉伸或缩小对话框内容,则需要自行完成。
Using the Code
文章的示例项目是使用 Microsoft Visual C++ 2008 创建的。 但是,代码不使用 MFC、ATL 或任何其他 VC++ 特定的框架或库。 该代码可以使用任何像样的 C/C++ 编译器进行编译,并且只需要 Windows 平台 SDK。
为了更好地组织源代码,该项目使用了所谓的消息破解器。 Windows 消息破解器是定义在 PSDK 的 include 目录中的 WindowsX.h 头文件中,简单的宏。 这里是关于 Windows 消息破解器的优秀描述:Message Cracker Wizard for Win32 SDK Developers。
基本上,可滚动对话框的算法如下:
- 在
WM_INITDIALOG
处理程序中,设置滚动条的初始范围(最大值和最小值)和页面大小。 将页面大小与范围相同,以便默认情况下隐藏滚动条。 - 在
WM_SIZE
处理程序中,设置滚动条的新页面大小,以便滚动条会重新计算拇指大小并相应地重新绘制。 新页面大小等于客户端区域的宽度/高度。 如果需要,将窗口客户端区域滚动到视图中。 - 在
WM_HSCROLL
和WM_VSCROLL
消息处理程序中,使用ScrollWindow[Ex]
调用按请求的量滚动窗口客户端区域。 更新当前的滚动位置。
Windows 会完成剩下的工作。
历史
- 2009年1月29日:初始发布