gpt4 book ai didi

winapi - 在 WTL 中实现自定义绘制控件中的滚动

转载 作者:行者123 更新时间:2023-12-01 08:31:51 25 4
gpt4 key购买 nike

我已经用 WTL 中的复选框创建了我自己的自定义绘制列表,我现在想让它可以滚动,问题是我正在继承我绘制的静态文本控件。我不知道静态控件是否支持任何滚动办法..
无论如何,我的问题是如何使我的自定义控件可滚动,我是否必须自己实现该机制?

最佳答案

是的,您必须完全手动实现它。这就是不使用内置控件的缺点。从 ListBox 开始,然后根据您的需要自定义它可能是一个更好的主意。这样,您将免费获得所有滚动、选择和其他逻辑。

步骤大致如下(可能有一些或所有这些的 ATL/WTL 习惯用法,但任何 ATL/WTL 程序员都可以从原始 Win32 来回转换):

  • WS_HSCROLL 和/或 WS_VSCROLL 窗口样式添加到您的自定义静态控件,具体取决于您想要水平滚动条、垂直滚动条还是同时使用两者。您可以将这些添加到传递给 CreateWindow/CreateWindowEx 函数的窗口样式列表中。
  • 默认情况下,这些滚动条根本不会做任何事情。您需要使用 SetScrollInfo 函数告诉他们该做什么。在你的情况下:
  • 第一个参数 (hwnd) 将是您的控制窗口的句柄。
  • 第二个参数( fnBar )应该是 SB_HORZ 调整水平滚动条,或 SB_VERT 调整垂直滚动条。
  • 第三个参数( lpsi )是一个指向 SCROLLINFO 结构体的指针,填充了需要的滚动参数,包括拇指的当前位置,最小值和最大值,以及用于设置比例滚动的“页面”大小酒吧。
  • 第四个参数 (fRedraw) 可能应该设置为 TRUE
  • 您还需要 EnableScrollBar 函数来根据需要启用/禁用滚动条。和之前的函数一样,
  • hwnd 是控制窗口
  • 的句柄
  • wSBflagsSB_HORZSB_VERTSB_BOTH
  • wArrowsESB_* 值之一,取决于你想要什么
  • 最后,您需要在自定义控件的窗口过程中编写代码来处理 WM_HSCROLL 和/或 WM_VSCROLL 消息。每当滚动条移动时,这些都会发送到窗口。在这些消息的处理程序内部,您需要执行以下操作来更新控件的状态:
  • 调用 SetScrollInfo 函数将拇指更新到新位置
  • 根据滚动距离重绘控件内容。有多种方法可以做到这一点,但我可能会使用 ScrollWindowEx 函数。

  • 自定义控件的窗口过程还需要处理 WM_SIZE 消息以更新滚动条状态(通过调用 SetScrollInfo 和/或 EnableScrollBar )以响应窗口大小的变化。

    关于winapi - 在 WTL 中实现自定义绘制控件中的滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18172938/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com