严重重绘闪烁问题 我在 dailog 上画一条直线,随着 列的拖动而移动,用到Invalidate(); updatewindows 重绘 出现闪烁问题,如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ……唉……不要没事儿就 Invalidate() ……你移动一小下,那是无数的 invalidate() 啊……一次 Invalidate,那就是全部推倒重来啊……使用 Onpaint 方法,去画线。画完之后,你就不用管了。 说得确切一些,是override 你窗体的 OnPaint 方法,用这个去画线。写法大概是这样的:override OnPaint ( drawContext ){ base.OnPaint(drawContext); // 下面是你的画线代码}这段只是示例代码,流程就是这样。重写 OnPaint 之后,线就画实了,你就不用再管了。 记下线的区域用InvalidateRect(&ret);擦除上次画的线 你可以设置一个缓冲值,当直线每移动了几个像素之后再用Invalidate 拖动完再刷新 如何实现双缓冲CDC MemDC; //首先定义一个显示设备对象Cbitmap MemBitmap; //定义一个位图对象//随后建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(NULL);//这时还不能绘图,因为没有地方画 //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);//将位图选入到内存显示设备中//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);//先用背景色将位图清除干净,这里我用的是白色作为背景//你也可以用自己应该用的颜色MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//绘图. . . . . .. . . . . .//将内存中的图拷贝到屏幕上进行显示pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//绘图完成后的清理MemBitmap.DeleteObject();MemDC.DeleteDC(); 楼主需不需要保存所绘制的线条?不需要的话根本就没必要调用Invalidate();只需使用GetDC获取窗口的DC然后使用该DC绘图就行了。简单 除了加双缓冲外,另外如果不需要背景重绘,可以直接给背景消息返回TRUE 只需使用GetDC获取窗口的DC 然后使用该DC绘图就行了 拖动完再刷新 如何实现双缓冲 CDC MemDC; //首先定义一个显示设备对象 Cbitmap MemBitmap; //定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图 . . . . . . . . . . . . //将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); 我有个关于双缓冲的问题,因为我使用双缓冲时,老是出现内存不能读的错误,但我双缓冲的代码并没有错误,感觉很奇怪.错误提示dbgheap.c文件,1017行错误 拖动完再刷新 如何实现双缓冲 CDC MemDC; //首先定义一个显示设备对象 Cbitmap MemBitmap; //定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图 . . . . . . . . . . . . //将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); 这代码放到哪里的 ? 刚到郑州,散分[抢沙发] 大家好!用MFC如何实现这个控件。 VPN网内.如何根据计算机名获取IP ado中动态建立MDB文件 我想用VC制作五子棋这样的小游戏。请各位大侠帮帮忙! [新手]一个简单的问题! 关于发送消息一问! 请问关于windows.h的几个函数的用法和功能。 高分:手机应用程序中的一个模块 ---- 铃声的编码 (给我UP吧,有分) 请问有没有办法自定义WindowsNT/2000的登陆过程? 文本提取的问题,请各位达人指教。 求助:文件只能保存在当前文件夹,保存到其他地方失败!!
{
base.OnPaint(drawContext);
// 下面是你的画线代码
}这段只是示例代码,流程就是这样。重写 OnPaint 之后,线就画实了,你就不用再管了。
InvalidateRect(&ret);
擦除上次画的线
CDC MemDC; //首先定义一个显示设备对象
Cbitmap MemBitmap; //定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
. . . . . .
. . . . . .
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
不需要的话根本就没必要调用Invalidate();只需使用GetDC获取窗口的DC
然后使用该DC绘图就行了。简单
然后使用该DC绘图就行了
CDC MemDC; //首先定义一个显示设备对象
Cbitmap MemBitmap; //定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
. . . . . .
. . . . . .
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
CDC MemDC; //首先定义一个显示设备对象
Cbitmap MemBitmap; //定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
. . . . . .
. . . . . .
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC(); 这代码放到哪里的 ?