新手想做个小游戏,遇到了问题。Timer的频率一条高屏幕就闪得厉害。网上都说用OnEraseBkgnd的方法,道理懂,但不知道具体怎么做才好。
以前做过一个对话框的小游戏,SetTimer(1,15,NULL),屏幕也只有轻微的闪,这回用View,闪的太夸张了,要刷新的东西很少,估计还是OnEraseBkgnd的问题。求大神指导!最好不要讲到线程,还不太会用。
看过这个帖子,意思懂了,但改了几次都不行。
http://topic.csdn.net/u/20091012/14/2b948708-6d7b-498a-9806-a2adbd000c5d.html部分代码
void CChildView::OnPaint() 
{
CPaintDC dc(this); 
SetTimer(1,250,NULL);
// 用于绘制的设备上下文
// TODO: 在此处添加消息处理程序代码

// 不要为绘制消息而调用 CWnd::OnPaint()
}void CChildView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC pDC(this);
OnEraseBkgnd(&pDC);
CWnd::OnTimer(nIDEvent);
}BOOL CChildView::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
StartMenu(pDC); //一个画图的函数,里面东西不多
return TRUE;
//return CWnd::OnEraseBkgnd(pDC);
}

解决方案 »

  1.   

    “要刷新的东西很少”
    在OnEraseBkgnd(CDC* pDC)中,画了什么?
    StartMenu(pDC); //一个画图的函数,里面东西不多
      

  2.   

    关键是你画了点啥,是不是多步操作pDC,至少确保是用双缓存了
      

  3.   

    在OnPaint函数里面设置定时器?画面每重画一次就设置一次定时器,这样行得通?建议还是用双缓冲吧,这才是解决闪屏的终极方法。
      

  4.   


    我都是一些划线的函数,双缓存应该起不了什么作用吧,我觉得问题不在这。ontimer应该调用什么比较好呢?
    操作画图的函数又应该在哪个函数里调用呢?
      

  5.   

    另外我把定时器SetTimer换成在Mainframe里定义了,没什么改变
      

  6.   


    如果只是部分文字闪烁的话你可以看看这些文字是什么时候画上去的,是不是一直都在重画?还有,定时器设置一次就可以了,可以放在构造函数或初始化函数中,程序退出的时候再KillTimer。你的代码贴的太少了,我不知道闪烁的文字是不是在OnEraseBkgnd中画的。
      

  7.   


    用了双缓存,确实不闪了,但里面的Settextcolor()怎么不起作用呢?