如何防止闪烁??? 我编了一个程序:当鼠标在窗体内部时会有一个圆圈跟随.编译运行都可以.就是鼠标移动时圆圈除了跟随移动同时闪烁不停,何解?如何消除这种闪烁现象?各位如果知道就帮帮我吧!!!谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不好意思,以下是主要代码:....//先在CMoveballView中声明protected变量int x;int y;并在构造函数中初始化为-100void CMoveballView::OnDraw(CDC* pDC) //在OnDraw中画这个跟随鼠标移动的圆{ CMoveballDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPen Pen; Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0)); CBrush Brush; Brush.CreateSolidBrush(RGB(225,225,0)); pDC->SelectObject(Pen); pDC->SelectObject(Brush); pDC->Ellipse(x-50,y-50,x+50,y+50);//半径为50}...void CMoveballView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default x=point.x; y=point.y; Invalidate(); //更新圆的位置 CView::OnMouseMove(nFlags, point);}... Invalidate()引起系统的重绘,系统会先帮你重新填充窗口背景色,再绘制该圆,就会闪烁,你把绘图代码移动OnMouseMove中试下。最号先用背景色填充,再绘制跟踪圆 void CMoveballView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default x=point.x; y=point.y; Invalidate(); //<---这样肯定会闪烁,因为你把View里的东西包括背景//全部先删除,再重新画了一遍。 CView::OnMouseMove(nFlags, point);}你可以用橡皮筋的技术来实现你跟踪鼠标移动的圆。大致是先用异或画一个以前画的圆来擦除原先的圆,再正常画当前的圆。 cayw(天行者) 提出的方法当然可以解决一些简单的移动问题(比如背景是单一颜色),但如果我的背景是一幅位图之类比较复杂的东西,画一个以前画的圆来擦除原先的圆应该比较麻烦吧?不知道有没有解决这类问题的一个比较好的方法? 双缓冲:void CMoveballView::OnDraw(CDC* pDC) //在OnDraw中画这个跟随鼠标移动的圆{ CMoveballDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPen Pen; Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0)); CBrush Brush; Brush.CreateSolidBrush(RGB(225,225,0)); CDC dcMem; CBitmap bm; CRect rc; GetClientRect(&rc); dcMem.CreateCompatibleDC(pDC); bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); dcMem.SelectObject(&bm); dcMem.SelectObject(Pen); dcMem.SelectObject(Brush); dcMem.Ellipse(x-50,y-50,x+50,y+50);//半径为50 pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY); dcMem.DeleteDC(); bm.DeleteObject();} MEMDC最常用的地方就是防止DC在绘制图形时出现闪烁的问题,Invalidate()函数是在屏幕上绘图,不停的重复绘制,图形的轨迹形成了闪烁的问题,使用MEMDC是在内存中画图,屏幕上没有图形轨迹,闪烁的问题自然就不存在了。 vc++ 串口通信问题? 控件界面显示不完整?切换到其它程序,再切换到当前程序,此时所有显示就正常了。 TM2008的界面是用什么技术做的? 地图导航 CRgn裁剪问题 多线程下,锁的问题,请多赐教! 关于多文档视图的打开视图问题 Access的惊人发现(另一个问题,来者有分) 关于CAsyncSocket的问题两个 又一个有关全局钩子的问题,请大家帮帮忙(目前系统只让我给这么多分,抱歉) vc++中dll输入参数为string,输出为date型与string型 配置文件的问题
....
//先在CMoveballView中声明protected变量int x;int y;并在构造函数中初始化为-100
void CMoveballView::OnDraw(CDC* pDC) //在OnDraw中画这个跟随鼠标移动的圆
{
CMoveballDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen Pen;
Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0));
CBrush Brush;
Brush.CreateSolidBrush(RGB(225,225,0));
pDC->SelectObject(Pen);
pDC->SelectObject(Brush);
pDC->Ellipse(x-50,y-50,x+50,y+50);//半径为50
}
...
void CMoveballView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
x=point.x;
y=point.y;
Invalidate(); //更新圆的位置
CView::OnMouseMove(nFlags, point);
}
...
{
// TODO: Add your message handler code here and/or call default
x=point.x;
y=point.y;
Invalidate(); //<---这样肯定会闪烁,因为你把View里的东西包括背景
//全部先删除,再重新画了一遍。
CView::OnMouseMove(nFlags, point);
}
你可以用橡皮筋的技术来实现你跟踪鼠标移动的圆。
大致是先用异或画一个以前画的圆来擦除原先的圆,再正常画当前的圆。
不知道有没有解决这类问题的一个比较好的方法?
双缓冲:void CMoveballView::OnDraw(CDC* pDC) //在OnDraw中画这个跟随鼠标移动的圆
{
CMoveballDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen Pen;
Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0));
CBrush Brush;
Brush.CreateSolidBrush(RGB(225,225,0)); CDC dcMem;
CBitmap bm;
CRect rc;
GetClientRect(&rc);
dcMem.CreateCompatibleDC(pDC);
bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
dcMem.SelectObject(&bm); dcMem.SelectObject(Pen);
dcMem.SelectObject(Brush);
dcMem.Ellipse(x-50,y-50,x+50,y+50);//半径为50 pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY); dcMem.DeleteDC();
bm.DeleteObject();
}