划船器項目第二版程序出現的問題

划船器項目第二版程序

第二版程序要求:控制槳頻 ,控制力量,熱身用,界面美化!

界面美化工作由美工承擔。

程序動畫調整思路:

第一版程序動畫部分顯示在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)方案,應該選擇第一種方案,因爲第一種方案更加直接,不會涉及到整個屏幕的更新,更不會出現開始和退出兩個按鈕在更新動畫的時候不能顯示出來的問題!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章