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

纯 Win32 API 中的可滚动对话框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (37投票s)

2009年1月30日

CPOL

2分钟阅读

viewsIcon

125936

downloadIcon

4961

在纯 Win32 API 中实现可滚动对话框的极简示例

ScrollDialog

图 1. 完全打开的对话框窗口。

scroll_dialog_resize.png

图 2. 滚动对话框窗口。

引言

弹出对话框窗口是 Windows 世界中最常见的 GUI 元素之一。 每个人都知道如何使用 DialogBox 函数调用创建对话框。 同样,每个人都知道默认情况下弹出对话框既不能调整大小,也不能滚动。 不幸的是,没有一个很好的例子展示了如何在纯 Win32 API 中实现简单可调整大小和可滚动的对话框,而无需使用 MFC、ATL、WTL 等。 大多数示例都需要 MFC 或其他 GUI 框架。 本文演示了如何在纯 Win32 API 和 Windows 平台 SDK 中实现可滚动的对话框窗口。

背景

可滚动对话框背后的思想非常简单。 为了获得可滚动的对话框,需要做的所有事情总结如下:

  1. 在资源编辑器中为对话框指定可调整大小的边框,或者手动将 WS_THICKFRAME 样式添加到对话框模板。
  2. 启用对话框窗口的滚动条,或者将 WS_VSCROLL | WS_HSCROLL 样式添加到对话框窗口。
  3. 处理 WM_RESIZEWM_HSCROLLWM_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

基本上,可滚动对话框的算法如下:

  1. WM_INITDIALOG 处理程序中,设置滚动条的初始范围(最大值和最小值)和页面大小。 将页面大小与范围相同,以便默认情况下隐藏滚动条。
  2. WM_SIZE 处理程序中,设置滚动条的新页面大小,以便滚动条会重新计算拇指大小并相应地重新绘制。 新页面大小等于客户端区域的宽度/高度。 如果需要,将窗口客户端区域滚动到视图中。
  3. WM_HSCROLLWM_VSCROLL 消息处理程序中,使用 ScrollWindow[Ex] 调用按请求的量滚动窗口客户端区域。 更新当前的滚动位置。

Windows 会完成剩下的工作。

历史

  • 2009年1月29日:初始发布
© . All rights reserved.