代码之家  ›  专栏  ›  技术社区  ›  ravenspoint

MFC列表控件滚动显示额外的网格线

mfc
  •  2
  • ravenspoint  · 技术社区  · 18 年前

    我在带有网格线的报表视图中使用MFC列表控件,以模糊的电子表格方式显示数据。

    有时,当用户垂直滚动控件时,会绘制额外的网格线,这看起来很糟糕。

    当使用滑块或鼠标滚轮滚动时不会发生这种情况,只有当使用滚动控件底部的小向下箭头按钮时才会发生。

    当列表控件窗口的大小不是精确的偶数行时,似乎会发生这种情况,因此部分行在底部可见。

    如果我调整列表控件的大小,使其没有可见的部分行,那么问题就解决了。然而,当程序在另一台计算机上运行时,它会出现,可能是因为一行所占的像素数发生了变化。

    我假设这是屏幕分辨率、字体大小和“对话框单位”之间的交互。

    我想我需要在创建控件时以编程方式强制其大小。但是什么尺寸?

    我尝试过使用ApproximateViewRect()方法,但无法使其工作。也许这个方法不了解报表视图?

    我想,另一种方法是创建我自己的CListCtrl专业化,并覆盖任何正在进行滚动的方法。这似乎需要做很多工作。

    此屏幕截图显示了网格线缺失的一个密切相关的问题

    alt text

    这里有一条额外的网格线

    alt text

    这两个控件之间以及它们与完美滚动的控件之间的唯一区别是控件的垂直大小相差几个像素。

    4 回复  |  直到 7 年前
        1
  •  6
  •   Aidan Ryan    18 年前

    这确实是一个与“平滑滚动”相关的错误,这里有一个解决方法:

    void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        __super::OnVScroll(nSBCode, nPos, pScrollBar);
        Invalidate();
        UpdateWindow();
    }
    
        2
  •  1
  •   Aardvark    18 年前

    我记得这是ListView本身的一个错误(不仅是通过MFC,而且是通用控件)。在谷歌上快速搜索一下,似乎很多人都得出了同样的结论。我想既然Windows资源管理器没有网格线,他们就觉得没有必要修复这个问题?我记得在90年代末。

    我想诀窍是在滚动后使窗口无效——也许是为了响应VSCROLL消息?只是猜测。

        3
  •  0
  •   Roel    18 年前

    这是在股票列表视图中发生的,还是在自定义绘图中发生的?我从未见过标准窗口控件的重绘问题。

    也许你可以发布一个截图来说明这个问题?我想你更愿意解决重绘问题,而不是精确地调整控件的大小?

        4
  •  -1
  •   ravenspoint    18 年前

    要修复MFC列表控件中的此错误,您需要专门化该控件,覆盖响应滚动的方法,并在滚动完成后强制其完全重新绘制列表。

    接口标头

    class cSmoothListControl : public CListCtrl
    {
    public:
        DECLARE_MESSAGE_MAP()
        afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    };
    

    实施:

    BEGIN_MESSAGE_MAP(cSmoothListControl, CListCtrl)
    ON_WM_VSCROLL()
    END_MESSAGE_MAP()
    
    void cSmoothListControl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        // call base class method to do scroll
        CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
    
        // force redraw to cover any mess that may be created
        Invalidate();
        UpdateWindow();
    }
    
    推荐文章