2017-04-20 18 views
0

基本的な(テンプレート)MFCアプリケーションを試していますが、タイマイベントに従ってCDocument(モデルを表す)インスタンスを更新しようとしています。サークルの経過時間と速度に従って、クライアント領域の1つの点から別の点にサークルします。私は、アプリケーションクラスにタイマーを起動するためのコードを追加しましたタイマを使用してMFCドキュメント/ビューアプリケーションを更新する

:毎秒タイマーメッセージに60回を送信する必要があります

m_timer = m_pMainWnd->SetTimer(16, 1000, NULL); 

。 しかし、私はいくつかの問題に遭遇しています:

は派生CDocument .cppファイルが動作しないためのメッセージマップへON_WM_TIMER()エントリを追加し、(ポインタを無効にするにはメンバ関数ポインタをキャスト)c2446エラーを引用。

具体的なCViewクラスで同じことを試みてもエラーは発生しませんが、OnTimer関数は呼び出されません。 OnTimerが今までに呼び出された唯一の場所は、次のシグネチャを使用して、派生CFrameWndExクラスである

afx_msg void OnTimer(UINT_PTR nIDEvent); 

私の知る限り、CFrameWndExはどちらかの変化を起動するための方法はありませんCViewまたはCDocument派生クラス。

これは単にMFCアーキテクチャに関する深刻な知識が不足していることを意味していると思いますので、私はいくつかの指摘を感謝します。

+0

[CWnd :: SetTimer](https://msdn.microsoft.com/en-us/library/49313fdf(v = vs.120).aspx)に独自のコールバックを渡すことができますタイマーメッセージを処理するためのウィンドウクラス。 – IInspectable

+0

@IInspectableはい私はそれを認識していますが、それは私がタイマーメッセージに基づいてドキュメント/ビューを更新するためにどのように使用するのか分からないという中心的な問題に対処していません。私が知る限り、 'CFrameWndEx'オブジェクトはどちらかについての知識がありません。 –

+0

'CMyDocument :: OnTimer()'関数の署名を投稿できますか? – sergiol

答えて

3

CView派生クラスにOnTimer関数とON_WM_TIMERメッセージマクロを追加します。 CViewから、GetDocument()を呼び出すことができます。それが最も簡単な方法です。ドキュメントはウィンドウではないため、ウィンドウメッセージを処理できません。彼らが扱うことができる唯一のものは、MFCがコマンドメッセージルーティングを介してそれらのメッセージに応答する機会を文書に与える方法のため、WM_COMMANDメッセージです。

もう1つの方法は、TIMERPROC関数を作成することです。

私は最初の方法をお勧めします。

+0

私が私の質問で言及したように、私は最初の方法を行い、OnTimer関数は呼び出されませんでした。 –

+0

@IanYoung:関連するソースコードを表示する必要があります。 'CView'は' CWnd'から派生しているので、タイマーをインストールして、 'CView'(または' CView'由来)クラスのインスタンスにタイマーメッセージを処理させることができます。 – IInspectable

+1

m_pMainWnd-> GetActiveView() - > SetTimer(...) –

1

Joe Willcoxsonと同様に、具体的ににOnTimerメソッドを入れてください。あなたがSetTimerメソッドを使用することはできませんしかし、あなたは投稿のように:

m_timer = m_pMainWnd->SetTimer(16, 1000, NULL); 

あなたは、例えば、m_pMainWndせずに、それはあなたのCViewクラスでsomehere呼び出す必要があります以下のような:

CMyView::OnInitialUpdate() 
{ 
    m_timer = SetTimer(16, 1000, NULL); // also nullptr instead of NULL would be nice 
} 

そうでない場合は、メインウィンドウには、常にメッセージを処理CWndなります。

関連する問題