MFCでのプログラム作成において、OnTimer関数が呼ばれない問題について

このQ&Aのポイント
  • 超初心者の質問です。MFCでのプログラム作成中に、OnTimer関数が呼ばれない問題に直面しています。CxxxsocketクラスでSetTimerおよびOnTimerが使用できないため、代わりの方法を模索しています。
  • Cxxxsocketクラスでは、SetTimerとOnTimerを使用することができないため、別の解決策を探しています。アクティブなメインウィンドウを取得するためにafxGetMainWnd()関数を使用し、CFrameWndやCxxxAppのポインタを取得することができますが、SetTimerのイベントは正しく処理されません。
  • 使用しているCMainFrameクラスで定義されているOnTimer関数を使用したいのですが、SetTimerの呼び出し方法に問題があるようです。解決策を見つけるために、より詳細な調査と検討が必要です。
回答を見る
  • ベストアンサー

超初心者の質問です。今、MFCでプログラムを作成しています。問題は、O

超初心者の質問です。今、MFCでプログラムを作成しています。問題は、OnTimer関数が呼ばれないことです。 Cxxxsocket::test (){ (CMainFrame *)afxGetMainWnd()->SetTimer(1, 100, Null); } CxxxsocketはCsocketのクラスでSetTimerおよびOnTimerは使えません。この関数でSetTimerを呼び出したい。 afxGetMainWnd()はアプリケーションのアクティブなメイン ウィンドウへのポインタをさしており、恐らくCFrameWndのCMainFrame もしくは、CWinAPPのCxxxAppのポインタをさしていると思います。CFrameWndの場合、OnTimerが定義されているので、SetTimerのイベントは本OnTimerにて処理されると考えていたのですが、全くOnTimerがCallされません。 CMainFrameで利用しているOnTimerを使いたいのですが、SetTimerの呼び出し方法に問題あるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Vidocq
  • ベストアンサー率66% (6/9)
回答No.2

CMainFrameに外部からSetTimerをして、CMainFrame内部のOnTimerをコールする、 ということならばSetTimerには問題がないように思います。 確認するポイントとしては、 CMainFrameのヘッダーでafx_msg修飾子付で宣言されていること class CMainFrame : public CMDIFrameWnd {   afx_msg void OnTimer(UINT nIDEvent); }; メッセージマップにON_WM_TIMERが記述されていること BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() OnTimerは下記のように定義されていること void CMainFrame::OnTimer(UINT nIDEvent) {     //ここに任意の処理を書く CMDIFrameWnd::OnTimer(nIDEvent); } でしょうか。

findbine
質問者

お礼

正直に言うと、SetTimerにセットしていた時間が長すぎて、OnTimerが呼ばれないものだと勘違いしていました。今は呼べてます。大変お手数おかけしました。お手数多謝!

その他の回答 (1)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

メッセージループが回っていないとか。

findbine
質問者

お礼

回答有難うございます。 タイマーが長すぎただけです。初歩的すぎる間違いでした。。。

関連するQ&A

  • TimerProc コールバック関数を利用する方法

    タイマを使いたくてメッセージマップでOnTimerを追加しましたが、 CWnd::SetTimerの第3パラメタに何を設定したらよいかわかりません。 lpfnTimer WM_TIMER メッセージを処理するためのアプリケーションが用意した、 TimerProc コールバック関数のアドレスを指定します。 このパラメータが NULL の場合は、WM_TIMER メッセージはアプリケーションの メッセージ キューに置かれ、CWnd オブジェクトによって処理されます。 とあり、NULL指定のサンプルはあるのですが、 「TimerProcコールバック関数のアドレスを指定する法」を試したいのです。 関数のアドレスというのが何をいっているのか理解できないのですが 試しに void CXXXCtrl::method1() { SetTimer(timerID, 10000, &OnTimer); } void CXXXCtrl::OnTimer(UINT nIDEvent) { // 処理 COleControl::OnTimer(nIDEvent); } としたところ error C2276: '&' : 仮想関数のアドレスを取ろうとしました。 のエラーになってしまいます。

  • CMainFrameクラスの使い方

    すみませんが教えてください。 これまで左クリックで画面に文字を表示するときには、何も考えずCxxxViewクラスにWM_LBUTTONDOWNをかいていました。ところがCMainFrameクラスにもちゃんとWN_LBUTTONDOWNが用意されているではないですか。 先ほど教えていただいたばかりの左クリックにてウインドウサイズ変更ができると思い以下のようにしましたが、何も起きませんでした。 どうすれば実現できるのでしょうか? CMainFrameクラスのWN_LBUTTONDOWNはどのような時に使うのですか? void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください AfxGetMainWnd()->SetWindowPos(NULL,100,200,300,400,SWP_SHOWWINDOW); CFrameWnd::OnLButtonDown(nFlags, point); }

  • SetTimerの行でアサートエラーが出てしまう

    MFCで、実行中 SetTimer(10, 1000, NULL); を記述しているコードでアサートエラーが出てしまいます。 クラスはCWnd継承クラスで作成し、afxwin.hをインクルード、 OnTimer関数を追加したのですが、この関数に飛びません。 MESSAGE_MAPにはON_WM_TIMER()の記述を確認しています。 何がいけないのか教えてください。お願いします。

  • [MFC] SetTimer関数の扱い方について

    [MFC] SetTimer関数の扱い方について MFCを扱い始めた初心者です。Settimerを用いて1秒間隔でOnTimer関数を呼び出そうと思い試行錯誤していたのですが、どのように記述してよいのかを教えてください。 実装したい機能は、ボタン1によりタイマを開始し、OnTimer関数を1秒間隔で呼び出し、ボタン2によりその動作を停止させたいのです。以下のコードを記述しますので、ご説明をよろしくお願いします。 NForm(){  btnの定義; btn2の定義; Picutureboxのpboxの定義; } int __stdcall WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { Application::Run(new NForm()); return 0; } void NForm::btn_Click(Object *sender, System::EventArgs *e) { if(sender->Equals(btn)){ setTimer(1, 1000, NULL); } else if(sender->Equals(btn2)){ setTimer(1, 1000, NULL); } } void NForm::onTimer(UINT nIDEvent) { if(nIDEvent == 1){ HDC hDC; hDC = GetDC(NULL);//Full screen capture HDC hMemDC = CreateCompatibleDC(hDC); RECT r; SIZE size; size.cx = GetSystemMetrics(SM_CXSCREEN); size.cy = GetSystemMetrics(SM_CYSCREEN); HBITMAP hBitmap = CreateCompatibleBitmap(hDC, size.cx, size.cy); if (hBitmap) { HBITMAP hOld = (HBITMAP) SelectObject(hMemDC, hBitmap); BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY); SelectObject(hMemDC, hOld); DeleteDC(hMemDC); ReleaseDC(NULL, hDC); pbox->Image = Image::FromHbitmap(hBitmap); DeleteObject(hBitmap); } capture_cnt++; char name[80]; sprintf(name, "capture_%d.jpg", capture_cnt); pbox->Image->Save(name,Drawing::Imaging::ImageFormat::Jpeg); NForm::onTimer(1); } else if(nIDEvent == 0){ NForm::onTimer(0); } } 上記のコードにおいて、Ontimer関数を単体で動作させた場合はきちんと動作します。 どうか、よろしくお願いします。

  • ATLでのPostMessageについて

    ATLでコントロールの開発をしています。 PostMessageでコントロールにメッセージを送信したいのですが、 MFCでいうAfxGetMainWnd()のようなグローバル関数はあるのでしょうか。 ::PostMessage(???, WM_COMMAND, ID_XXXX, NULL);

  • SetTimer関数について。

    プログラム初心者です。質問させてください! 現在私はWin32APIを用いて、簡単なプログラムを作成しています。 そこで例えばイベントAが起きた10秒後にあるアクション(1)をさせたくて、 WM_イベントAの時: SetTimer(hWnd,ID_MYTIMER1, 10000, NULL); というようにプログラムを書きました。 そのSetTimer関数が実行されることより、 WM_TIMER:イベントが発生するので、WM_TIMER:イベントのところにあるアクション(1)をさせるプログラムを書きました。 しかし、イベントAが起きた100秒後には、あるアクション(1)とは違うあるアクション(2)をさせたいのですが、 この場合、WM_イベントAが起きたときに、 SetTimer(hWnd,ID_MYTIMER1, 10000, NULL); SetTimer(hWnd,ID_MYTIMER2, 100000, NULL); のようにプログラムをかいてしまうと、 二つともWM_TIMERイベントがおこるので、 あるアクション(1)も(2)も100秒後には実行されてしまいます。 100秒後にはアクション(1)はおこらず、アクション(2)だけおこる。 10秒後にはアクション(2)はおこらず、アクション(1)だけおこる。 このようにするには、どのようにすればいいのでしょうか? アドバイスよろしくお願いいたします。

  • VC++でMFCアプリ作成中です。

    MFCの既存のフレームで、「最近使ったファイル」という欄があります。 これを選んだ際に、指定したプログラムでそのファイルを開きたいのですが、うまくいきません。 どうすればよろしいでしょうか? HogeView.cpp ...(省略) /*************************************** OnOpenRecentFileのオーバーライド ***************************************/ BOOL CWinApp::OnOpenRecentFile(UINT nID) { ASSERT_VALID(this); ASSERT(m_pRecentFileList != NULL); ASSERT(nID >= ID_FILE_MRU_FILE1); ASSERT(nID < ID_FILE_MRU_FILE1 + (UINT)m_pRecentFileList->GetSize()); int nIndex = nID - ID_FILE_MRU_FILE1; ASSERT((*m_pRecentFileList)[nIndex].GetLength() != 0);        /* 選んだファイルを表示 */ AfxMessageBox((*m_pRecentFileList)[nIndex]); CHogeView *myview = new CHogeView(); ★ myview->GetDocument()->SetFilePath((*m_pRecentFileList)[nIndex]); AfxMessageBox(myview->GetDocument()->GetFilePath()); myview->ReadFile((*m_pRecentFileList)[nIndex]); TRACE2("MRU オリジナル関数内: open file (%d) '%s'.\n", (nIndex) + 1, (LPCTSTR)(*m_pRecentFileList)[nIndex]); if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL){ m_pRecentFileList->Remove(nIndex); } return TRUE; } /****************************************************************** ファイル読み込み ******************************************************************/ void CHogeViewerView::ReadFile(CString filename){ ...(省略) } コンパイルはできるのですが、どうやら★のところがうまく行かず、 Debug Assertion Failed! とエラーがでます。 何が原因なのでしょうか?

  • OnTimerの使い方

    <環境> WIN98 VC++6.0 MFC  こんな感じで3秒経過するとメッセージボックスを表示していますが、 メッセージボックスのOKボタンを何度も押さないとメッセージボックスが 閉じない時が有ります。 (どうやらメッセージボックスが何個も作られている) どうしてなのでしょうか? BOOL CAbcDlg::OnInitDialog() { // TODO: 特別な初期化を行う時はこの場所に追加してください。 SetTimer(1, 1000, NULL); m_cnttime = 0; 略 void CAbcDlg::OnTimer(UINT nIDEvent) { m_cnttime++; if ( m_cnttime >= 3 ) { AfxMessageBox(""); KillTimer(nIDEvent); } CDialog::OnTimer(nIDEvent); }

  • VC++ MFC CFrameWndって・・・

    こんにちわMFC初心者です MFCアプリケーションウィザードを利用してMFCの画面を作成するとCFrameWndを元にしたCMainFrameクラスが作成されますが、コレはプロジェクト起動時に一番最初にインスタンスが作成されるクラスと考えて良いのでしょうか? また、他のサンプルプログラムでCMainFrameクラス内のメンバとしてCWndクラスを元にしたCChildViewが定義されていますが、この場合はCChildViewはCMainFrameの子フォームになるのですかね? 更にCChildView内部でCImageクラスを元にしたimgOriginalが定義されていますが、これはCChildViewに設置するコントロールですかね?(VBでいうところのピクチャーコントロール見たいなモンですかね?) 目的として、特殊な画像形式を利用する為、CImageクラスを利用して画像表示が出来ないので、特殊な画像形式のファイルからピクセル単位のデータを取得して画像表示をしたいのですが、この時にCDCクラスを利用して画像表示したいのですが、上手く表示されません これは、自分のMFCに対する認識が間違っているのでは無いかと思い皆様に質問させて戴いた次第です 皆様、私の認識に間違いがないかどうか、コメントをお願い致します m(__)m

  • VC++のシンボルブラウザについて

    VC++の勉強をはじめた初心者です。 時計を表示させる機能を学習しているのですが、 コールバック関数を使わず、WM_TIMERメッセージのみで 作成しています。 そのときにシンボルブラウザで タイマーIDを追加する意味がわかりません。 もともと、シンボルブラウザとは??? っというところから疑問なのですが、 その後、 SetTimer(○○○,1000,NULL); とし、時計用タイマーをスタートさせているのですが、 WM_TIMERの関数OnTimerで CTimeクラスのインスタンスを生成して、 GetCurrentTimeを使っています。 なんだか、わかりづらい説明で申し訳ないのですが、 時計用タイマーをスタートさせておいて、 なぜ、GetCurrentTimeで現在の時間を取得するのか 同じことを2回やっているような~ なにをやっているんだろう?? っと、混乱気味です。 すいません。長くなってしまいましたが、 うまく説明できないこの意味を理解してもらえたら 教えてください。(シンボルブラウザの意味も、、、)

専門家に質問してみよう