看板 C_and_CPP 關於我們 聯絡資訊
跟各位分享一下,悍衛概念整體性的例子。 只是想請問一下,GetActiveWindow()的部份 是不是可以在CPattern初始化的過程,就將CWnd* 放進Circle中... 不需再另外使用Circle::setWnd(CWnd*); 呢? 文章+程式的網誌版 http://darkblack01.blogspot.tw/2013/02/circleanimation.html BBS純文字版 在CPatternDlg中,宣告了一個圈圈物件 class CPatternDlg : public CDialog { Circle m_Goal; }; 因為想要圈圈做動畫,並且用下面的呼叫方式(漂亮的語法) void CPatternDlg::readyScreen() { //... m_Goal.Animation(); } 注意事項: 在此的動畫實作,是另外呼叫一個Thread來跑動畫程式段。 原本的做法 UINT CPatternDlg::vbrGoalThread(LPVOID LParam) { //... for (int i = 0; i < 100; ++i) { PtnDlg->InvalidateRect(pGoal->VbrFun(i, oriR)); PtnDlg->UpdateWindow(); } } pGoal->VbrFun(i, oriR) 為動畫的數學式子(自已決定) InvalidateRect();和UpdateWindow();為更新視窗的函數。 使用 void CPatternDlg::readyScreen() { //... vbrGoalThread((LPVOID)&Info1); } 在準備畫面時,執行這個函數,就會出現動畫。 難點: 動畫需要更新畫面,所以必動畫的每一頁更新的步驟,會建在CPattern::Animation() 但若做成CPattern::Animation(Circle& ),就違反概念整體性,也不OO了 後來的做法 我們來看看,先將動畫函數建在Circle class Circle { private: CWnd* m_pdlgcWnd; static void elasticAnimation(LPVOID LParam); //開新的Thread public: CWnd* getWnd(){ return m_pdlgcWnd; }; void setWnd(CWnd* cWnd){ m_pdlgcWnd = cWnd; }; void Animation(){ elasticAnimation((LPVOID)&m_Info1); }; }; 在CPattern::CPattern()完成後,再用另一個函數將CWnd*存進Circle,為了畫面更新控 制權。 void CPattern::SomeFunction() { //... m_Goal.setWnd(GetActiveWindow()); //GetActiveWindow()需等建構式完成才可以 抓取 } 最後在Circle裡建Animation(),再將「開新的Thread」函數隱藏起來 void Circle::elasticAnimation(LPVOID LParam) { //... for (UINT i = 0; i < 100; ++i) { _pCircle->getWnd()->InvalidateRect(&_pCircle->DampingVibration(i, _pCircle->GetRadius()), TRUE); _pCircle->getWnd()->UpdateWindow(); } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.163.194.46 ※ 編輯: Zephyr750 來自: 203.163.194.46 (02/27 00:23)