我正在使用 ScrollHelper [1] 代码尝试在我的 CWnd (ProgressListWnd) 对象中实现滚动。在这个 CWnd 中,我有多个子 CWnd 对象 (ProgressWnd) 被放置在父 ProgressListWnd 中。我发现的一切都是处理在 CWnd 中绘制的图像或文本/形状,而不是仅处理带有子 CWnd 的父 CWnd。
实现 ScrollHelper 似乎“工作”,但我的问题是在 ProgressListWnd 中的 OnPaint 中,我重新定位每个子对象。我读到,当调用 OnScroll 时,它以向窗口发送绘制事件结束。由于我从 0,0 开始并向下重新定位孩子,因此似乎没有任何移动。
我的父窗口的 onPaint 如下。任何与滚动条相关的内容都直接来自 ScrollHelper 类。
是否有一种更简单的方法可以在仅包含子 CWnd 对象的 CWnd 中滚动?重新绘制时,我是否需要手动跟踪我的孩子 CWnds 上的滚动位置和 MoveWindow() 到负位置(添加或删除孩子时需要这样做)?
[1]
http://www.codeproject.com/Articles/10902/Add-Scrolling-to-a-CWnd-or-CDialog-using-aC-Helpe
void CProgressListWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
POSITION pos = m_ProgressMap.GetStartPosition();
int corner = 0;
while(pos != NULL)
{
int uid = 0;
CProgressWnd* pWnd = NULL;
m_ProgressMap.GetNextAssoc(pos, uid, pWnd);
if(pWnd != NULL)
{
pWnd->MoveWindow(0,corner,400,90);
corner = corner + 90;
}
}
}