none
动态控制list滚动条显示衍生的bug RRS feed

  • 问题

  • 一个dockpane里面放了一个list

    这边的list的滚动条大部分时候是隐藏的

    在鼠标放上去之后会让他显示出来,这时候启动一个定时器五秒之后再隐藏掉

    这时候会有一个bug,就是在我改变dockpane宽度的时候,如果竖向滚动条在显示状态

    在改变dockpane宽度的过程中滚动条隐藏  就会出现ListHeader大小没跟着变化不涮新的情况

    如图  右边部分header没显示出来,通过spy++工具得到header右边界就在那块了

    

    具体隐藏显示滚动条代码如下

    void myListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
    {
    	if (m_ScrollBarX == TRUE || m_ScrollBarY == TRUE)
    	{
    		DWORD dwStype = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
    		dwStype &= ~LVS_NOSCROLL;
    		SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStype);
    	}
    	ShowScrollBar(SB_HORZ, m_ScrollBarX);
    	ShowScrollBar(SB_VERT, m_ScrollBarY);
    	if (m_Header.m_hWnd != nullptr)
    	{
    		m_Header.Invalidate();
    	}
    	CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);
    }

    2019年8月7日 12:18

全部回复

  • 你好,

    感谢你在MSDN论坛发帖。

    你所说的listheader是指的CListCtrl::GetHeaderCtrl()获得的表头吗?如果发生你所说的这种情况,我觉得应该在dockpane的onsize()中去调用一下CListCtrl::GetHeaderCtrl()->MoveWindow()来改变一下他的宽度。

    Best Regards,

    Suarez Zhou

    2019年8月8日 7:42
  • 你好,

    请问你的问题解决了吗?如果解决了,请标记正确的回复为答案,我们也欢迎你将自己的解决方案分享出来,并标记为答案,这会帮助其他有相同问题的人更快地找到解决方案。如果没有,欢迎随时提问。谢谢。

    Best Regards,

    Suarez Zhou

    2019年8月12日 2:54
  • 我之前采用了MoveWindow()这种方式

    导致了另一个问题

    就是  当你滚动条移动到后面的时候,这时候要是调用CListCtrl::GetHeaderCtrl()->MoveWindow()

    会出现HeaderCtrl的列和list的列不对应的情况

    也就是说因为滚动条的存在   实时显示的是第五列开始,GetHeaderCtrl()还是第一列开始显示

    所以这种方法还是不行的

    2019年8月13日 3:15
  • 你好,

    很抱歉,还原你的环境花费了点时间,因此没有及时回复你的问题。

    >>具体隐藏显示滚动条代码如下

    确认下你是在WM_NCCALCSIZE消息响应函数里显示隐藏滚动条,当客户区发生变化时,你希望如果有垂直或水平滚动条就显示出来。m_Header是表头吗?还是其他什么,你希望他的客户区无效,然后刷新?

    我认为错误可能与这一块相关,由于我不知道这一块内容所指是什么,所以我的代码中没有这一块内容,显示大致正常。你方便提供一下你代码中的细节内容吗?或者提供一个能还原这个问题的demo,我们将不甚感激。

    Best Regards,

    Suarez Zhou

    2019年8月14日 6:04