2

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

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

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

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

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

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

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

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

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

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

替代文字

这是一个带有额外网格线的

替代文字

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

4

4 回答 4

6

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

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    __super::OnVScroll(nSBCode, nPos, pScrollBar);
    Invalidate();
    UpdateWindow();
}
于 2008-10-08T17:34:55.340 回答
1

我记得这是 ListView 本身的一个错误(不仅仅是通过 MFC,而是通过通用控件)本身。一个快速的谷歌搜索似乎让很多人得出了同样的结论。我猜因为 Windows 资源管理器没有网格线,他们觉得不需要解决这个问题?我记得这要追溯到 90 年代后期。

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

于 2008-10-08T17:14:43.307 回答
0

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

也许您可以发布屏幕截图来说明问题?我想您更愿意修复重绘问题而不是精确调整控件的大小?

于 2008-10-08T14:46:12.420 回答
-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();
}
于 2008-10-08T18:58:08.497 回答