如何让绘图一点也不闪烁

shager 2006-10-19 02:01:06
在单文档的View类的OnDraw()函数中加入如下代码,在拖动窗口的时候为什么会闪烁,OnEraseBkgnd()函数也重载了,返回的TRUE。
CRect rect;
GetWindowRect(&rect);
CBrush hBrush(RGB(255,0,0));
CBrush* pOldBrush = pDC->SelectObject(&hBrush);
DWORD count = 0;
DWORD dwArg = 0;

do
{
dwArg = (dwArg + 100) % 500;
count++;
pDC->Rectangle(dwArg + 200, rect.bottom - (count/10) - 200,dwArg+0x40 + 200, rect.bottom - 200);
Sleep(1);

} while (count < 2000);

pDC->SelectObject(pOldBrush);
...全文
479 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
shager 2006-11-18
  • 打赏
  • 举报
回复
没办法的了,原来是系统重绘不行,我用画图,以及Photoshop打开一张图,就是一个红色的矩形,在拖动窗口的时候都一直有这样的闪烁了。
zhuminghui 2006-10-26
  • 打赏
  • 举报
回复
重绘的时间太长,当然会出现闪烁
gudyn 2006-10-26
  • 打赏
  • 举报
回复
w_anthony() ( ) 信誉:100 Blog 2006-10-21 10:56:44 得分: 0

处理WM_ERASEBKGND消息(不然画面还是被清了),直接返回TRUE,然后再在OnDraw里面建一个内存DC,一张全白位图,把所有的绘图操作都砸向内存DC,完事了,再从内存DC用Bitblt直接画到参数pDC上。




天涯倦客 2006-10-26
  • 打赏
  • 举报
回复
在内存做图,然后一次拷贝显示
neosu 2006-10-26
  • 打赏
  • 举报
回复


主要的循环不要在OnDraw里写. OnDraw里啊做一个DC到DC的画图就可以了.
打雷啦的专栏 2006-10-26
  • 打赏
  • 举报
回复
不是时间长的问题.
3层应该是背景已经画好,保存在HBITMAP中,这个HBITMAP 只有在调整大小的情况下才去画一下.这样再使用双缓存技术,背景已经画好了,贴上来就好了,所以相当于3层.
shager 2006-10-25
  • 打赏
  • 举报
回复
你们可以把代码加到程序里,再编译一下看看。好想是系统刷新的问题,在窗口没有被覆盖的时候(WM_PAINT没有产生,OnDraw()没有被调用),这时候有闪烁?该怎么消除?
Tan18 2006-10-24
  • 打赏
  • 举报
回复
定义一个内存位图为类变量,在初始化时将你要绘制的东西画到内存位图上,然后在ondraw里面只需要pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);就行了。
shager 2006-10-23
  • 打赏
  • 举报
回复
楼上的,不是那句的问题呢
w_anthony 2006-10-21
  • 打赏
  • 举报
回复
处理WM_ERASEBKGND消息(不然画面还是被清了),直接返回TRUE,然后再在OnDraw里面建一个内存DC,一张全白位图,把所有的绘图操作都砸向内存DC,完事了,再从内存DC用Bitblt直接画到参数pDC上。
压宝散人 2006-10-21
  • 打赏
  • 举报
回复
关注一下
shager 2006-10-21
  • 打赏
  • 举报
回复
楼上的?步骤是什么?要如何做?
marrco2005 2006-10-21
  • 打赏
  • 举报
回复
下面是加了双缓冲的代码,还是有一样的问题
CRect rect;
GetClientRect(&rect);
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);
CBrush hBrush(RGB(255,0,0));
CBrush* pOldBrush = MemDC.SelectObject(&hBrush);
DWORD count = 0;
DWORD dwArg = 0;

do
{
dwArg = (dwArg + 100) % 500;
count++;
MemDC.Rectangle(dwArg + 200, rect.bottom - (count/10) ,dwArg+0x40 + 200, rect.bottom );
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY); <===============把这句移到循环之外

} while (count < 3000);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY); 《=========移到这里
MemDC.SelectObject(pOldBitmap);
MemDC.SelectObject(pOldBrush);
MemDC.DeleteDC();
======================================================================
BitBlt 的位置不对
CUG122032 2006-10-21
  • 打赏
  • 举报
回复
把显示器关了就不闪了.
laviewpbt 2006-10-20
  • 打赏
  • 举报
回复
怎么样叫三层缓冲?
烨炜带火 2006-10-20
  • 打赏
  • 举报
回复
拖动过程中不重绘,绘制拖动的一个框,完成后再绘制!
shager 2006-10-20
  • 打赏
  • 举报
回复
下面是加了双缓冲的代码,还是有一样的问题
CRect rect;
GetClientRect(&rect);
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);
CBrush hBrush(RGB(255,0,0));
CBrush* pOldBrush = MemDC.SelectObject(&hBrush);
DWORD count = 0;
DWORD dwArg = 0;

do
{
dwArg = (dwArg + 100) % 500;
count++;
MemDC.Rectangle(dwArg + 200, rect.bottom - (count/10) ,dwArg+0x40 + 200, rect.bottom );
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);

} while (count < 3000);

MemDC.SelectObject(pOldBitmap);
MemDC.SelectObject(pOldBrush);
MemDC.DeleteDC();
Tan18 2006-10-20
  • 打赏
  • 举报
回复
三层缓冲?
shager 2006-10-20
  • 打赏
  • 举报
回复
双缓冲也还是一样的,你们可以试试
yuge2008 2006-10-20
  • 打赏
  • 举报
回复
3层?!
加载更多回复(5)

19,468

社区成员

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

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