4

我已经用 WTL 中的复选框创建了自己的自定义绘制列表,我现在想让它可滚动,问题是我正在子类化一个静态文本控件,我在该控件上绘制..而且我不知道静态控件是否支持滚动方式..无论如何,我的问题是如何使我的定制控件可滚动,我是否必须自己实施机制?

4

2 回答 2

6

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

步骤大致如下(其中部分或全部可能有 ATL/WTL 习语,但任何 ATL/WTL 程序员都可以从原始 Win32 来回转换):

  1. WS_HSCROLL和/或WS_VSCROLL窗口样式添加到您的自定义静态控件中,具体取决于您是否需要水平、垂直或两个滚动条。您可以将这些添加到传递给 CreateWindow/CreateWindowEx 函数的窗口样式列表中。

  2. 默认情况下,这些滚动条根本不会做任何事情。您需要告诉他们如何使用该SetScrollInfo功能。在你的情况下:

    • 第一个参数 ( hwnd) 将是您的控制窗口的句柄。
    • 第二个参数(fnBar)应该是SB_HORZ调整水平滚动条,或者SB_VERT调整垂直滚动条。
    • 第三个参数(lpsi)是一个指向SCROLLINFO结构体的指针,里面填入了想要的滚动参数,包括拇指的当前位置、最小值和最大值,以及用于设置比例滚动条的“页面”大小。
    • 第四个参数 ( fRedraw) 可能应该设置为TRUE.

  3. 您还需要根据需要EnableScrollBar启用/禁用滚动条的功能。和之前的功能一样,

    • hwnd是控制窗口的句柄
    • wSBflagsSB_HORZ, SB_VERT, 或SB_BOTH
    • wArrowsESB_*值之一,取决于你想要什么

  4. 最后,您需要在自定义控件的窗口过程中编写代码来处理WM_HSCROLL和/或WM_VSCROLL消息。每当滚动条移动时,它们就会发送到窗口。在这些消息的处理程序内部,您需要执行以下操作来更新控件的状态:

    • 调用SetScrollInfo函数将拇指更新到新位置
    • 根据滚动距离重绘控件的内容。有多种方法可以做到这一点,但我可能会使用该ScrollWindowEx功能。

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

于 2013-08-11T14:53:25.040 回答
6

Cody Gray 为添加滚动支持提供了出色的介绍,但您还拥有 WTL 本身的帮助。

WTLatlscrl.h为您提供类来继承和实现带有滚动的自定义窗口/控件。

// Classes in this file:
//
// CScrollImpl<T>
// CScrollWindowImpl<T, TBase, TWinTraits>
// CMapScrollImpl<T>
// CMapScrollWindowImpl<T, TBase, TWinTraits>
// CFSBWindowT<TBase>
// CZoomScrollImpl<T>
// CZoomScrollWindowImpl<T, TBase, TWinTraits>
// CScrollContainerImpl<T, TBase, TWinTraits>
// CScrollContainer

没有那么多代码/片段来演示使用,但仍然有一个涵盖基础知识的 WTL 示例,它也应该是一个很好的起点。\Samples\BmpView有一个可滚动位图的类:

class CBitmapView : 
  public CScrollWindowImpl<CBitmapView>
{
public:

您会看到它非常小,并且涵盖了大部分复杂性。

于 2013-08-11T15:09:52.627 回答