划船器项目第二版程序
第二版程序要求:控制桨频 ,控制力量,热身用,界面美化!
界面美化工作由美工承担。
程序动画调整思路:
第一版程序动画部分显示在picture control控件中,通过双缓冲技术。
第二版程序动画部分显示当初有两种方案:
a)仍然通过双缓冲技术显示在picture control控件中,同时picture control控件做透明化处理,或者将picture control控件遮挡住的对话框界面做成图片然后在程序中由picture control控件加载。
b)直接在窗口对话框中绘制动画
本人采集的是第二种方案 ,即b)直接在窗口对话框中绘制动画
第二种方案中存在的主要问题?
1)获取对话框的句柄
BOOL CMatchDlg::OnInitDialog()
{
CDialog::OnInitDialog();
·······
CWnd* pWnd1;
pWnd1 =FromHandle(this->m_hWnd);
·········
2)动画显示时m_staRemainingDis1,m_staRemainingDis2,·······m_staRemainingDis6控件闪烁
事实上,在第一版程序中,m_staRemainingDis1已经继承自CTransparentStatic,实现了透明化处理并且动态显示时没有出现重影(文字重叠)。那为什么第二版程序中会出现CTransparentStatic闪烁呢?原因在于该程序的m_staRemainingDis1等控件的显示和动画的显示分别在不同的定时器中:
SetTimer(TIMER_ID_UPDATEDIS,50,NULL); //更新当前电脑的移动距离,m_staRemainingDis1等控件的显示
SetTimer(TIMER_ID_ANIMATION ,18,NULL); //更新动画
由此可以看出,TIMER_ID_UPDATEDIS的定时间隔50毫秒要比TIMER_ID_ANIMATION的定时间隔18毫秒要大,就相当于m_staRemainingDis1控件只要一显示出来,就会被
更新动画的部分所遮盖,造成了m_staRemainingDis1等控件的闪烁!
相反如果将TIMER_ID_UPDATEDIS的定时间隔设置的小一点,TIMER_ID_ANIMATION设置的大一点就不会出现m_staRemainingDis1控件的闪烁问题了。
3)开始和退出两个按钮在更新动画的时候不能显示出来
原因也在于第二种方案是直接通过双缓冲将动画显示在对话框上(先在内存上画背景图,再在背景图上画动画,最后copy到屏幕上),这一个过程导致控件被覆盖,需要重绘才能显示出来。但在定时器中强制重绘时候,按钮又会出现闪烁的问题。
GetDlgItem(IDC_BUTTON31)->Invalidate();
GetDlgItem(IDCANCEL)->Invalidate();
总结:当初不应该选择b)方案,应该选择第一种方案,因为第一种方案更加直接,不会涉及到整个屏幕的更新,更不会出现开始和退出两个按钮在更新动画的时候不能显示出来的问题!