双缓冲绘图,鼠标闪烁 使用位图,来实现双缓冲绘图,但是为什么鼠标会闪烁。也就是将内存的图贴到屏幕上去的那一瞬间,每次鼠标都会闪烁。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 贴代码。。OnEraseBkgnd ()函数return TRUE; 我只是简单的将屏幕抓取,然后什么工作都不做,然后就贴上,每次贴上的瞬间鼠标闪烁 CDC *pDC = GetDC(); CDC memDCT; CRect crect; GetClientRect(&crect); CBitmap memBitmap; CBitmap *pOldBitmap = NULL; memDCT.CreateCompatibleDC(pDC); memBitmap.CreateCompatibleBitmap(pDC, crect.Width(), crect.Height()); pOldBitmap = memDCT.SelectObject(&memBitmap); memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY); //我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。 pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY); memBitmap.DeleteObject(); memDCT.DeleteDC();这是一个画图函数。fun()。我将这个函数放在onTimer()中。如果把onTimer()中调用fun的地方注释掉,鼠标就不会出现闪烁,说明闪烁实在fun()中,产生的 SetTimer()中时间设置的越短,闪烁的越厉害。 memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY); //我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。 pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);你这什么意思?BitBlt两次, memory DC copy src DC, src DC copy memory DC,还有这段代码你写在哪里?OnPaint中吗? 把你的绘图操作放在OnPaint或OnDraw函数中 第一次BitBlt()的目的是将当前屏幕图片放到位图中去然后对这个位图增加几条线。也就是说在抓取的图片的基础上更改抓取的图片。然后第二次BitBlt就是把这个位图贴到屏幕上去。 memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY); //我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。 pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);你贴来贴去,干什么? 放到 onDraw()当中?我需要定时向当前屏幕的图增加几条曲线。也就是每间隔一定时间就要在上一次图的基础上增加几条线所以,我就使用两次BitBlt 看来我还是没表述清楚。第一:我需要把当前屏幕的图放到位图,于是就第一次BitBlt,其中,memDCT用于内存绘图。向这个位图添加几条线。添加的代码我省略了。然后第二次BitBlt就是把处理过的位图贴到屏幕上去。 如果不适用2次BitBlt的话,每次绘图的时候,都要把以前的点加上去,如果点比较多的话,会影响绘图速度。所以选择了2次BitBlt,第一次把屏幕图片保存到位内存位图中,然后对其操作,操作完了之后,贴上去。这样,每次绘图我只需要添加几个点,没有必要把以前的点也一个一个的重新画上去。 楼主用一次BitBlt就可以把内存绘制好的图形或图片复制到显示端上,鼠标闪烁有可能和这个有关系 楼主其实完全不用memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY);你应该将每次画的,自己保存才对!不要将已经显示的画会内存!你每次都是对内存画,然后贴出来,内存有一个bmp专门保存这个位图即可!双缓冲,第一次看到如楼主这么用的,呵呵! timer 里面先bitblt 到memory DC 里然后在Paint事件里 bitblt到 窗体里就好了 我的分析就是把当前的屏幕显示的图像bitblt到memDC的时候,鼠标箭头也BitBlt过去了。所以鼠标箭头会闪烁。不知道有没有办法解决这个问题。然后,关于将当前图像的点保存到动态数组,有点问题,就是数组的上限不好确定。我的实时曲线就跟流水一样,是从右往左流的。一直在流。也就是说整个曲线都一直在滚动,所以,究竟要保存到少个点,这个不太好确定。 测试过了。就是因为将屏幕的画面 BitBlt到内存中的时候,鼠标会闪烁。刚刚看了网上的介绍,BitBlt默认截图是不会把鼠标图形截取的,那么为什么鼠标闪烁了?莫非是导致了鼠标重绘??还是??不知道各位有何解决办法。谢谢 利用view类的OnEraseBkgnd成员函数,绘制背景图像与位置相同,则不会出现闪烁现象 文本框中如何识别功能键 关于“双缓存”,可能对你有用 vc6+sql server200的程序打包问题 vc如何使用pdb调试软件和代码阿 对话框最小化后单击右键的菜单功能问题 如何用cipaddress计算ip地址数 关于背景闪烁的问题 续"小题大作"再开一贴,两贴共151分,两天了,请各位指点一下,时间过地太快了。 有关com端口通信的问题 简单的Delphi代码转换成C代码 关于vc6 的cl.exe link.exe nmake.exe makefile文件,高手指导一下 帮个忙,谢谢!解决了,马上 散分,谢谢啊!!
CDC *pDC = GetDC();
CDC memDCT; CRect crect;
GetClientRect(&crect); CBitmap memBitmap;
CBitmap *pOldBitmap = NULL;
memDCT.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC, crect.Width(),
crect.Height());
pOldBitmap = memDCT.SelectObject(&memBitmap); memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY);
//我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。
pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);
memBitmap.DeleteObject();
memDCT.DeleteDC();这是一个画图函数。fun()。我将这个函数放在onTimer()中。如果把onTimer()中调用fun的地方注释掉,鼠标就不会出现闪烁,说明闪烁实在fun()中,产生的
//我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。
pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);
你这什么意思?BitBlt两次, memory DC copy src DC, src DC copy memory DC,还有这段代码你写在哪里?OnPaint中吗?
第一次BitBlt()的目的是将当前屏幕图片放到位图中去然后对这个位图增加几条线。也就是说在抓取的图片的基础上更改抓取的图片。然后第二次BitBlt就是把这个位图贴到屏幕上去。
//我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。
pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);
你贴来贴去,干什么?
放到 onDraw()当中?我需要定时向当前屏幕的图增加几条曲线。也就是每间隔一定时间就要在上一次图的基础上增加几条线所以,我就使用两次BitBlt
看来我还是没表述清楚。
第一:我需要把当前屏幕的图放到位图,于是就第一次BitBlt,其中,memDCT用于内存绘图。向这个位图添加几条线。添加的代码我省略了。然后第二次BitBlt就是把处理过的位图贴到屏幕上去。
你应该将每次画的,自己保存才对!不要将已经显示的画会内存!你每次都是对内存画,然后贴出来,内存有一个bmp专门保存这个位图即可!
双缓冲,第一次看到如楼主这么用的,呵呵!