WinCE(evc)如何利用双缓冲使图不闪烁

hanchen528 2003-11-19 10:39:54
WinCE(evc)如何利用双缓冲使图不闪烁
我用定时器,每隔半秒钟就就重新画一次,但是老是闪烁,如何解决
...全文
174 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonelyprince 2003-12-01
  • 打赏
  • 举报
回复
用InvalidateRect是一定会闪的,
C++比较麻烦,
定义HWND hDrawWnd 在 BOOL InitInstance(hInstance, nCmdShow)中加入:
hDrawWnd = CreateWindow("DrawWClass",
NULL,
WS_CHILD| WS_VISIBLE | WS_BORDER,
0,
0,
(Rect.right-Rect.left),
(Rect.bottom-Rect.top),
hMainWnd,
NULL,
hInst,
NULL);
然后,在你要画图的函数中
void myPaint()
{
CDC hdc=GetDC(hDrawWnd);
……
BitBlt(hdc,rc.left,rc.top,rc.right,rc.bottom,memDC,rc.left,rc.top,SRCCOPY);
ReleaseDC(hDrawWnd, hdc);
}
刷新的时候调用myPaint()试一下!
载舟之水 2003-11-27
  • 打赏
  • 举报
回复
不知道你有没有看我的回答,我上面没写完。另外说一下 InvalidateRect不是刷新函数,它只是构造一个要刷新的区域,UpdateWindow才会发送刷新的WM_PAINT消息,你如果想用MFC的函数就要建议MFC的 project。
你只要在wndproc里面加入(和WM_COMMAND是并列的):

case WM_ERASEBKGND:

return(true);//擦除白色背景,解决闪烁

break;

这样可能解决问题。
hanchen528 2003-11-27
  • 打赏
  • 举报
回复
我知道你在第一次回贴的时候说的方法是MFC利用的
而我的程序是inW32写的,我按照那个方法一步一步的做,但是连图像都不显示
怎末回事呀?我的刷新就只能InvalidateRect函数呀
lonelyprince 2003-11-26
  • 打赏
  • 举报
回复
MFC用起来多方便啊,为什么不用,我不知道你是怎么使用这段代码的。
希望背景色是白色,再画图之前先调用下面的函数,
pdc->PatBlt(rc.left, rc.top, rc.Width(), rc.Height(),WHITENESS);
把位图清空。
我不清楚你的刷新视图的机制,要想不闪的话,定义一个设备环境对象,
然后调用OnDraw重新绘图,不要用Invalidate/InvalidateRect函数。
载舟之水 2003-11-25
  • 打赏
  • 举报
回复
呵呵,你只是想消除闪烁而已?并不是要加速吧,双缓冲可以加速图像显示达到减小闪烁的目的,但是这不是闪烁的根本原因,每隔半秒已经够画图的时间了吧?很久以前CSDN就有双缓冲的例子
有人回帖说,闪烁是由眼睛造成的,我觉得这是根本的原因,因为两幅画面差异太大,造成视觉的闪烁,除非你每秒刷75帧(显示器就是如此),否则眼睛还是看起来是闪烁的.
你在窗口消息里加入

case WM_ERASEBKGND:
//return NULL;
break;

注释也可以放开用,试试看,如果你确实需要高速图像显示的话,推荐你用Gapi做吧.
hanchen528 2003-11-25
  • 打赏
  • 举报
回复
我按着上面的去做,背景色由白色变成了黑色了,我希望背景色是白色,但是闪烁的很厉害呀
没有完全照搬上面的,因为点区别,下面是我画图部分的代码,想知道哪里错了

HBITMAP Bitmap;
HDC memDC,hdc;
HBITMAP pOldmap;
RECT rc;

HBRUSH hBr,hOldBr;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rc);
memDC=CreateCompatibleDC (hdc);
Bitmap=CreateCompatibleBitmap(hdc,rc.right- rc.left,rc.bottom-rc.top );
pOldmap=(HBITMAP)SelectObject (memDC,Bitmap);
Polyline (memDC,Noodle,2);
BitBlt(hdc,rc.left,rc.top,rc.right,rc.bottom,memDC,rc.left,rc.top,SRCCOPY);

DeleteDC(memDC);
EndPaint(hWnd, &ps);
hanchen528 2003-11-25
  • 打赏
  • 举报
回复
我创建的是WCE POCKET PC的工程,没有CDC memDC;
CBitmap Bitmap;
CRect rc;
这样的类定义呀,还有就是如何利用memDC画图
假如就是画一条直线,怎末画呀???谢谢
blue2moon 2003-11-25
  • 打赏
  • 举报
回复
单就画图来讲,Wince和PC完全一样,lonelyprince(龙) 的
方法就是最常用的。
楼主基础知识好像待充实,找本基础书籍看看,上面肯定有。
hanchen528 2003-11-25
  • 打赏
  • 举报
回复
我 创建的是WCE POCKET PC 应用程序,没有CDC 这种类的定义呀,还有就是用memDC如何画图呀,假如就是画一条直线。
lonelyprince 2003-11-21
  • 打赏
  • 举报
回复
CDC memDC;
CBitmap Bitmap;
CRect rc;
GetClientRect(&rc);
memDC.CreateCompatibleDC(pdc);
Bitmap.CreateComptibleBitmap(pdc,rc.Width(),rc.Height);
CBitmap *pOldmap=memDC.SelectObject(&Bitmap);
用memDC这个环境变量画图。
pdc->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(),
&memDC, rc.left, rc.top,SRCCOPY);
ok?
hanchen528 2003-11-20
  • 打赏
  • 举报
回复
能否给我列举几行代码?谢谢
lonelyprince 2003-11-20
  • 打赏
  • 举报
回复
在内存中创建空白位图,再位图上画图,然后显示位图,
就不会闪烁了。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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