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

时间:2008-10-08 14:40:14

标签: mfc

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

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

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

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

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

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

我想我需要以编程方式强制控件在创建时的大小。但大小是多少?

我尝试过使用ApproximateViewRect()方法,但我无法让它工作。也许这种方法不了解报告视图?

我认为另一种方法是创建我自己的CListCtrl专门化并覆盖任何滚动方法。这似乎可能是很多工作。

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

alt text

这里有一个额外的网格线

alt text

这两者之间以及它们之间的唯一区别是完全滚动的一个区别是控件的垂直尺寸有几个不同的像素。

4 个答案:

答案 0 :(得分:6)

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

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    __super::OnVScroll(nSBCode, nPos, pScrollBar);
    Invalidate();
    UpdateWindow();
}

答案 1 :(得分:1)

我记得这是ListView中的一个错误(不仅仅是通过MFC,而是一般的通用控件)本身。快速谷歌似乎打击了很多人得出同样的结论。我想因为Windows资源管理器没有网格线,他们觉得不需要修复这个问题?我记得在90年代后期。

我猜诀窍是在滚动后使窗口无效 - 可能是为了响应VSCROLL消息?只是一个猜测。

答案 2 :(得分:0)

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

也许您可以发布截图来说明问题?我认为您更愿意修复重绘问题而不是确切地控制控件的大小?

答案 3 :(得分:-1)

要在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();
}