水平滚动条不会实时刷新的有关问题

水平滚动条不会实时刷新的问题
本帖最后由 huangqiyin 于 2012-11-08 16:43:01 编辑
问题详细描述如下:

自己写了一个类继承自CWnd,由于需要不断的加载然后绘制在视图上面,但是由于视图上的宽度参差不齐,有些时候很宽,导致一个子窗口显示不完全,这个时候就需要加载水平滚动条。
由于为了是滚动条操作起来更人性化,水平滚动条的滑块长度随着数据的宽度的大小实时的变化。

加载数据的方式 是通过拉动垂直滚动条。

当鼠标不断的拉着垂直滚动条跑的时候,那么水平滚动条的滑块可以实时的伸缩。但是我发现,情况不会如此,当数据加载后,我把鼠标放到水平滚动条上后,水平滚动条的滑块如果和加载数据前不一样,那么滑块才会变化。也就是没有做到我想要的效果——水平滑块实时变化。
我断点调试发现:

BOOL CWnd::SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw)
{
ASSERT(lpScrollInfo != NULL);

HWND hWnd = m_hWnd;
CScrollBar* pScrollBar;
if (nBar != SB_CTL && (pScrollBar = GetScrollBarCtrl(nBar)) != NULL)
{
hWnd = pScrollBar->m_hWnd;
nBar = SB_CTL;
}
lpScrollInfo->cbSize = sizeof(*lpScrollInfo);
::SetScrollInfo(hWnd, nBar, lpScrollInfo, bRedraw);
return TRUE;
}

程序不会进入上面的if语句,也就是水平滚动条使用我子窗口的句柄而不是那个水平滚动条的句柄
我通过msdn查看GetScrollBarCtrl函数发现
Remarks
This member function does not operate on scroll bars created when the WS_HSCROLL or WS_VSCROLL bits are set during the creation of a window. The CWnd implementation of this function simply returns NULL. Derived classes, such as CView, implement the described functionality.

继承自CWnd类的 通过 WS_HSCROLL WS_VSCOLL 的滚动条 直接返回NULL,也就是不会重绘水平滚动条导致滚动条不会变化的。 必须继承CScrollView或者是 CView才可以,
请问谁有办法给我解决下这个,我不想去改变继承关系。难道我还得自己去绘制一个滚动条?各位有没有办法!!


------解决方案--------------------
CWnd::SetScrollInfo没有实现ScrollBar功能的话,就需要自己创建两个CScrollBar并处理了
------解决方案--------------------
引用:
引用:引用:引用:引用:CWnd::SetScrollInfo没有实现ScrollBar功能的话,就需要自己创建两个CScrollBar并处理了

我想问下 CScrollBar怎么和 和通过窗口创建出来的 滚动条……


nPage和nMax是逻辑上的值,滚动条的长度是界面上滚动条的实际长度,它跟窗口大小有直接关系。所以我认为nPage/nMax = 滑块长度/滚动条长度