我已经创建了自己的自定义绘制列表,带有复选框WTL,我想让它现在可滚动,事情是我正在子类化我绘制的静态文本控件..而且我不知道静态控件是否支持以任何方式滚动.. 无论如何,我的问题是如何使我的自定义控件可滚动,我是否必须自己强制机制?
答案 0 :(得分:5)
是的,你必须完全手工实施。这是不使用内置控件的缺点。从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
是控制窗口的句柄wSBflags
可以是SB_HORZ
,SB_VERT
或SB_BOTH
wArrows
是ESB_*
值之一,具体取决于您的需求
最后,您需要在自定义控件的窗口过程中编写代码来处理WM_HSCROLL
和/或WM_VSCROLL
消息。每当移动滚动条时,都会将它们发送到窗口。在这些消息的处理程序内部,您将需要执行以下操作来更新控件的状态:
SetScrollInfo
函数将拇指更新为新位置ScrollWindowEx
函数。
自定义控件的窗口过程还需要处理WM_SIZE
消息以更新滚动条状态(通过调用SetScrollInfo
和/或EnableScrollBar
)响应窗口大小的变化。
答案 1 :(得分:5)
Cody Gray为添加滚动支持提供了很好的介绍,但是你也有来自WTL本身的帮助。
WTL的atlscrl.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:
你会发现它非常小,它涵盖了大部分的复杂性。