无法设置CWinApp上的SetTimer函数 我目前正在制作一个C++ MFC应用程序,我需要一个计时器,每30秒左右调用一个叫做OnTimeT的函数。现在,我有一个这样的类: class CMyApp : public CWinApp { // Do some stuff... DECLARE_MESSAGE_MAP() BOOL InitInstance() { // m_pMainWnd is an object in CWinApp that allows me to render a window m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); // Do some stuff with this window ::SetTimer(NULL, 0, 30000, 0); } afx_msg void OnTimer(WPARAM wParam, LPARAM lParam) { // I want this function to execute every 30 seconds // This function manipulates the window } } BEGIN_MESSAGE_MAP(CMyApp, CWinApp) ON_THREAD_MESSAGE(WM_TIMER, OnTimer) END_MESSAGE_MAP() CMyApp theApp;

无法设置CWinApp上的SetTimer函数 我目前正在制作一个C++ MFC应用程序,我需要一个计时器,每30秒左右调用一个叫做OnTimeT的函数。现在,我有一个这样的类: class CMyApp : public CWinApp { // Do some stuff... DECLARE_MESSAGE_MAP() BOOL InitInstance() { // m_pMainWnd is an object in CWinApp that allows me to render a window m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); // Do some stuff with this window ::SetTimer(NULL, 0, 30000, 0); } afx_msg void OnTimer(WPARAM wParam, LPARAM lParam) { // I want this function to execute every 30 seconds // This function manipulates the window } } BEGIN_MESSAGE_MAP(CMyApp, CWinApp) ON_THREAD_MESSAGE(WM_TIMER, OnTimer) END_MESSAGE_MAP() CMyApp theApp;,c++,mfc,C++,Mfc,此方法确实获取要调用的OnTimer,但不是每30秒一次。事实上,OnTimer现在似乎一分钟要打几百次电话。我的问题是:如何设置我的班级计时器 我尝试过的事情 我已经尝试将用户扩展名从ON_THREAD_MESSAGE更改为ON_WM_TIMER、ON_命令和ON_MESSAGE。对于任何不在线程消息上的内容,我都会得到错误 error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMyApp::* )(WPARAM

此方法确实获取要调用的OnTimer,但不是每30秒一次。事实上,OnTimer现在似乎一分钟要打几百次电话。我的问题是:如何设置我的班级计时器

我尝试过的事情

我已经尝试将用户扩展名从ON_THREAD_MESSAGE更改为ON_WM_TIMER、ON_命令和ON_MESSAGE。对于任何不在线程消息上的内容,我都会得到错误

error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMyApp::* )(WPARAM,LPARAM)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'
我不确定,但我认为SetTimer可能正在操作某些特定于CWinApp的函数,而CWnd SetTimer没有被操作,并且被设置为一些默认值。不过,我在这里几乎一无所知,任何帮助都将不胜感激。

用于用户定义的消息,而不是
WM\u TIMER

根据文档,窗口句柄必须有效,并且计时器标识符必须为非零才能创建新计时器。例如:

::SetTimer(m_pMainWnd->m_hWnd, 1, 30000, NULL);
or 
m_pMainWnd->SetTimer(1, 30000, NULL);
该消息可以在主GUI窗口中处理。例如
cmainrame
CMyCMDIFrameWnd
,或
m_pMainWnd
指向的任何内容

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    ON_WM_TIMER()
    ...
END_MESSAGE_MAP()

void CMainFrame::OnTimer(UINT id)
{
    TRACE("OnTimer(%d)\n", id);
}
或者,您可以在
::SetTimer
中为窗口句柄使用
NULL
,但必须提供回调功能:

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    TRACE("TimerProc\n");
}

::SetTimer(NULL, 2, 30000, TimerProc);
用于用户定义的消息,而不是
WM\u TIMER

根据文档,窗口句柄必须有效,并且计时器标识符必须为非零才能创建新计时器。例如:

::SetTimer(m_pMainWnd->m_hWnd, 1, 30000, NULL);
or 
m_pMainWnd->SetTimer(1, 30000, NULL);
该消息可以在主GUI窗口中处理。例如
cmainrame
CMyCMDIFrameWnd
,或
m_pMainWnd
指向的任何内容

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    ON_WM_TIMER()
    ...
END_MESSAGE_MAP()

void CMainFrame::OnTimer(UINT id)
{
    TRACE("OnTimer(%d)\n", id);
}
或者,您可以在
::SetTimer
中为窗口句柄使用
NULL
,但必须提供回调功能:

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    TRACE("TimerProc\n");
}

::SetTimer(NULL, 2, 30000, TimerProc);

调用CWnd::SetTimer(NULL,30000,NULL)会导致以下错误:错误C2352:“CWnd::SetTimer”:非法调用非静态成员函数我尝试从CMyApp的InitInstance键入以下行:m_pMainWnd->SetTimer(0,30000,NULL)。我没有收到任何错误,但OnTimer仍然会在一分钟内被调用数百次,即使我将计时器设置为30秒。您可以存储SetTimer()返回的结果,并在处理程序中将其与wParam参数(
if(wParam==nIDEvent)
)进行比较,以确定消息是为您的计时器发送的还是为另一个计时器发送的。但我更愿意接受@Barmak Shemirani的建议,即让大型机处理计时器消息。调用CWnd::SetTimer(NULL,30000,NULL)会导致以下错误:错误C2352:'CWnd::SetTimer':非法调用非静态成员函数我尝试从CMyApp的InitInstance键入以下行:m_pMainWnd->SetTimer(0,30000,NULL)。我没有收到任何错误,但OnTimer仍然会在一分钟内被调用数百次,即使我将计时器设置为30秒。您可以存储SetTimer()返回的结果,并在处理程序中将其与wParam参数进行比较(
if(wParam==nIDEvent)
),以确定该消息是为您的计时器发送的还是为其他计时器发送的。但我更愿意接受@Barmak Shemirani的建议,即让主机处理计时器消息。