本人创建了一个dialog的mfc项目,并添加了一个Cstatic控件,在onPain函数里给Cstatic上绘画,绘画过程是通过计时器来执行,在SetTimer之前我必须屏蔽掉一些控件,例如执行如下代码: if (wParam)
{
GetDlgItem(IDC_STATIC_NUM_PANEL)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_PALY)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_STATIC_NUM_PANEL)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_PALY)->EnableWindow(FALSE);
}在killTimer里再次执行以上代码,不再屏蔽控件,但在SetTimer前执行以上代码和killTimer里执行以上代码,对话框都会闪一下,請各路大侠解释其中原理,小弟不胜感激!

解决方案 »

  1.   

    在IDC_BUTTON_PALY响应函数下 设置EnableWindow(FALSE);
    同时 SetTimer
    在OnTimer里EnableWindow(TRUE);
    同事 KillTimer
      

  2.   

    看不太明白楼主的意思, 画 Static 不应该在 Paint 里做. Paint 只有在窗口刷新时才调用, 窗口要刷新, 窗口必然会闪通常是只画控件, 闪烁会好一点
      

  3.   

    我现在就是这样实现的,只是我作为一个消息去实现而已,我帖出来的代码是放在一个自定义的消息函数里,
    在IDC_BUTTON_PALY响应函数下,SendMessage(WM_MYSSAGE,0);
    在OnTimer里SendMessage(WM_MYSSAGE,0);
    同时KillTimer但这样是会闪的!
      

  4.   

    闪屏是不是由于 【在onPain函数里给Cstatic上绘画】导致的?我猜测是(没有经过实践的答案)
    如果,onPain 的处理中只是 调用一个计时器操作,
    那么能否不响应 onPain 消息,而是把 计时器 单独拿到外面执行,设置定时时间。。
    另,等待高手解决。。
      

  5.   

    1.试试使用MFC自带的消息机制  先不用自己的MSG
    2.用PostMessage试试
      

  6.   


    你好,我不大明白你的意思,我把问题说明白点,我是在IDC_BUTTON_PALY响应函数下设置SetTimer,然后在计时器的执行函数里不段调用SendMessage(WM_PAIN)来更新绘画,这个过程是不会闪烁的,但在SetTimer前SendMessage(WM_MYMESSAGE,0)自己的消息就会闪一闪,然后KillTimer里再次SendMessage(WM_MYMESSAGE,1)又会闪一闪,整个过程就闪了两次.
      

  7.   

    看看对话框的WM_ERASEBKGND和WM_PAINT分别是怎么响应的,如果你在这两个消息中对整个窗口进行擦除和重绘就可能造成闪烁。
    另外,应该响应控件的WM_PAINT消息绘制控件,在窗口的WM_PAINT消息中绘制控件的做法是错的。