MFC自绘列表网格线的问题

baidu_28543119 2015-09-23 08:19:35
我是将列表设置为没有默认网格线的属性,然后在DrawItem中对网格线进行绘制的,但是当我点击竖向滚动条的向下或者向上按钮时,列表网格线的绘制发生错位,效果如下

但是当我用滚轮滚动或者拖拽滚动条时,都不会出现这种情况,代码如下:
void CMyListCtrl::DrawListGridLine(CDC* pDC)
{
const MSG *pMsg = GetCurrentMessage();
DefWindowProc( pMsg->message, pMsg->wParam, pMsg->lParam );
//Draw the lines only for LVS_REPORT mode
if( (GetStyle() & LVS_TYPEMASK) == LVS_REPORT )
{
// Get the number of columns
CHeaderCtrl* pHeader = GetHeaderCtrl();
int nColumnCount = pHeader->GetItemCount();
// The bottom of the header corresponds to the top of the line
CRect rectHeader;
pHeader->GetClientRect( &rectHeader );
int nTop = rectHeader.bottom;
// Now get the client rect so we know the line length and
// when to stop
CRect rectClient;
GetClientRect( &rectClient );
CPen newPen, *oldPen;
newPen.CreatePen(PS_SOLID, THIN_PEN_SIZE, m_clrLine);
oldPen = pDC->SelectObject(&newPen);
// The border of the column is offset by the horz scroll
//防止竖向网格线偏移
int borderx = 0 - GetScrollPos( SB_HORZ );
for( int i = 0; i < nColumnCount; i++ )
{
// Get the next border
borderx += GetColumnWidth( i );
// if next border is outside client area, break out
if( borderx >= rectClient.right ) break;
// Draw the Vertical line.
pDC->MoveTo( borderx , nTop);
pDC->LineTo( borderx , rectClient.bottom );
}
// Draw the horizontal grid lines
// First get the height
CRect rectItem;
if( !GetItemRect( ZeroIndex, &rectItem, LVIR_BOUNDS ))
return;
int nHeight = rectItem.bottom - rectItem.top;
GetClientRect(&rectClient);
int nLength = rectClient.right;
SCROLLINFO sSCrollInfo;
sSCrollInfo.cbSize = sizeof(SCROLLINFO);
GetScrollInfo(SB_VERT,&sSCrollInfo);
for( int i = 0; i <= GetCountPerPage(); i++ )
{
int k = nTop + nHeight * i;
pDC->MoveTo( 0, nTop + nHeight*i);
pDC->LineTo(nLength, nTop + nHeight*i);
}
//删除画笔
pDC->SelectObject(oldPen);
newPen.DeleteObject();
}
}
这是什么原因呢
...全文
395 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2015-09-23
  • 打赏
  • 举报
回复
代码看着没啥问题,不调试是没谱儿的.... 你的SB_TOP 和 SB_BOTTOM怎么处理?
笨笨仔 2015-09-23
  • 打赏
  • 举报
回复
跟踪一下,自绘中可能还要处理滚动条事件
包含文件说明: 1. SolveFlashingAndRedrawv1.0.4 纯净版 无闪烁的MFC应用框架,实际使用时把此工程改名成你要建立的项目名称,然后开始开发即可。你熟悉MFC的话研究这个框架的半个小时应该就明白并熟练运用了。 2.SolveFlashingAndRedrawv1.0.4 demo版 利用SolveFlashingAndRedrawv1.0.4框架写的一个示例小程序,主要展示框架要实现的优点特性。 3.VCRn 修改vc工程名工具 ___作者 田彬.exe 用网上找到的一个MFC改工程名称的小工具,很实用。如果你想使用本框架就可以用它来改成你想要的工程名了。 4. 未使用本框架的类似功能简化程序 没有使用框架的程序,实现的功能和Demo类似。但是运行之后改变窗口大小等,会发现图形闪烁很厉害! 5. SolveFlashingAndRedrawv1.0.4 demo版 运行截图.jpg 6. ReadMe.txt 说明文件。 框架说明: /****************************************************** SolveFlashingAndRedraw框架说明 ******************************************************/ /** 项目名称: demo框架 版本号: v1.0.4 第一作者: Jef 地址: 中国/江苏 日期: 20100416 电子邮箱: dungeonsnd@126.com 版权: 1.您可以修改及免费使用本程序。 2.修改之后附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: SolveFlashingAndRedraw框架是MFC解决窗口保存及重闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其意义 2. 增加为两个工程,一是带demo例子的,另一是不带demo的纯净版. 3. 修改了其中一个错误. 如 CreateCompatibleDC之后没有调用DeleteDC等. v1.0.3 对v1.0.2进行了整理 v1.0.4 20100416 在v1.0.3的基础上进行整理,并增加了裁剪区,提高了图效率! 运行步骤: 直接运行demo里面的程序,在窗口上任意拖拉鼠标画线,然后点击菜单栏的几个示范菜单项,然后移动窗口、 改变窗口大小、最大最小化窗口、用其它窗口覆盖此窗口、鼠标放到任务栏。。。 以上种种操作观察窗口内的图像变化。可以发现窗口内图像几乎看不到闪烁,而且窗口的元素已经保存下来重时任然可以看到图像。 如何使用: 进行项目开发时,可以先建立项目,然后把本解决方案框架拷贝到新建项目中即可。 也可以自己根据需要修改纯净版。 其它: 友情提示,小心 View类头文件及View类的实现文件中有说明,使用时别把它弄到你实际项目里哦! 进行大量复杂的图形的输出,而且对效率要求特别高时要考虑适当修改此框架(如增加裁剪区)后再使用哦。 关于如何在此框架的基础上提高图效率可以参阅下面的文章 如何提高图的效率 文章摘录 http://hi.baidu.com/new8sun/blog/item/68ccba8a80c3aadafc1f1079.html MFC双缓冲解决图象闪烁 2009-06-13 23:03 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC图函数效率很低,总是想寻求其它的解决方案。 MFC图效率的确不高但也不差,而且它的图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的图程序。 我想就我长期(呵呵当然也只有2年多)使用MFC图的经验谈谈我的一些观点。 1、显示的图形为什么会闪烁? .................................

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧