none
如何控制CListCtrl上的ScrollBar的刷新? RRS feed

  • 问题

  • 缺省不显示CListCtrl的滚动条,当鼠标移动到边缘时,显示滚动条。用ShowScrollBar(SB_HORZ/SB_VERT, TRUE)函数。

    但是现在显示的滚动条,是windows缺省的3D风格。此时点上面的滑块CListCtrl没有跟着滚动数据。就是说滚动条没有正常工作。

    此时抬起鼠标,再点击滚动条,此时滚动条被重绘了一次扁平风格,再拖动滑块CListCtrl上的数据就好用了。

    怎么解决这个问题,显示出滚动条以后,直接就是对的扁平风格的滚动条,然后直接拖动就好用?

    绘制扁平风格,似乎也不是CMFCVisualManager::OnDrawScrollButtons。在这里加断点没有断住。

    2019年6月14日 11:40

答案

  • 你好,

    感谢你在MSDN论坛发帖。

    这边测试当使用LVS_NOSCROLL属性设置CListCtrl时,再调用ShowScrollBar方法时,确实会补出一个不响应的滚动条。针对这种情况,我认为是LVS_NOSCROLL属性所致,推荐你在调用ShowScrollBar前,删除这个属性,在不需要显示这个滚动条时,再给其加上。经测试,可以满足你的需求。以下代码为鼠标移动的消息响应函数,仅供参考。

    void CMFCApplication17View::OnMouseMove(UINT nFlags, CPoint point)
    {
    	// TODO: Add your message handler code here and/or call default
    	CRect rect;
    	m_listctrl.GetWindowRect(&rect);
    	if ((point.x >= rect.left) && (point.x <= rect.right) && (point.y >= rect.top) && (point.y <= rect.bottom))
    	{
    		DWORD dwStype = GetWindowLong(a.GetSafeHwnd(), GWL_STYLE);
    		dwStype &= ~LVS_NOSCROLL;
    		SetWindowLong(a.GetSafeHwnd(), GWL_STYLE, dwStype);
    		m_listctrl.ShowScrollBar(SB_BOTH, TRUE);
    	}
    	else
    	{
    		DWORD dwStype = GetWindowLong(a.GetSafeHwnd(), GWL_STYLE);
    		dwStype = dwStype|LVS_NOSCROLL;
    		SetWindowLong(a.GetSafeHwnd(), GWL_STYLE, dwStype);
    		m_listctrl.ShowScrollBar(SB_BOTH, FALSE);
    	}
    	CView::OnMouseMove(nFlags, point);
    }
    

    Best Regards,

    Suarez  Zhou

    2019年6月17日 10:23