MFC ON_WM_TIMER () проблема со статическим приведением

Возникли проблемы с ON_WM_TIMER в моем классе CDatabaseApplicationApp, который расширяет CWinApp

> 1>c:\programs\databaseapplication\databaseapplication\databaseapplication.cpp(20):
> error C2440: 'static_cast' : cannot convert from 'void (__thiscall
> CDatabaseApplicationApp::* )(UINT_PTR)' to 'void (__thiscall CWnd::*
> )(UINT_PTR)' 1>          Types pointed to are unrelated; conversion
> requires reinterpret_cast, C-style cast or function-style cast

Я включил функцию OnTimer:

class CLifescanDatabaseApplicationApp : public CWinApp
{
public:
CLifescanDatabaseApplicationApp();
protected:
CLifescanDatabaseApplicationDlg * m_ptheWindow;
// Overrides
public:
virtual BOOL InitInstance();

// Implementation
afx_msg void OnTimer(UINT_PTR nTimerID);
DECLARE_MESSAGE_MAP()
};

OnTimer просто:

void CDatabaseApplicationApp::OnTimer(UINT_PTR nTimerID)
{
AfxMessageBox(_T("Help"));
}

Таймер устанавливается с помощью определения в верхней части исходного файла:

#define ID_TIMER_DATABASEQUERY 1

а также SetTimer определяется в

BOOL CDatabaseApplicationApp::InitInstance()
{
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles.  Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();AfxEnableControlContainer();
AfxInitRichEdit2();
// Create the shell manager, in case the dialog contains
// any shell tree view or shell list view controls.
CShellManager *pShellManager = new CShellManager;

// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization
SetRegistryKey(_T("Local AppWizard-Generated Applications"));m_ptheWindow = new CDatabaseApplicationDlg();
m_pMainWnd = m_ptheWindow;
if(m_ptheWindow!=nullptr)
{
m_ptheWindow->Create(CDatabaseApplicationDlg::IDD,CWnd::GetDesktopWindow());
m_ptheWindow->ShowWindow(SW_SHOW);
}
// Delete the shell manager created above.
if (pShellManager != NULL)
{
delete pShellManager;
}

if(!m_ptheWindow->SetTimer(ID_TIMER_DATABASEQUERY,10000,nullptr))
{
return false;
}
// Since the dialog has been closed, return FALSE so that we exit the
//  application, rather than start the application's message pump.
return TRUE;
}

Есть идеи, как я могу решить эту проблему?

0

Решение

Если вы позвоните SetTimer для главного окна,

if(!m_ptheWindow->SetTimer(ID_TIMER_DATABASEQUERY,10000,nullptr))
{
return false;
}

OnTimer переопределение, вероятно, должно быть в классе окна (производный от CWnd), а не в классе приложения.

0

Другие решения

CWnd::SetTimer принимает в качестве последнего аргумента указатель на функцию, которая будет вызываться для обработки сообщения WM_TIMER (функция обратного вызова).

Если этот аргумент установлен в NULL, OnTimer метод этого окна будет вызван, что означает, что вы должны переопределить OnTimer метод вашего CDatabaseApplicationDlg учебный класс.

Если вы не хотите этого делать, вам нужно явно указать функцию обратного вызова, то есть некоторую другую функцию, которая будет вызываться для обработки сообщения. Это может быть глобальная функция или статический член класса. Однако нестатический член класса не будет работать из коробки, так как указатели на функции-члены на самом деле не являются указателями, поэтому вам нужно заключить их во что-то другое.

Если твой CDatabaseApplication класс будет иметь статический член нравится:

void CDatabaseApplicationApp::OnTimer(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
{
// in your case:
// hWnd => HWND of your ID_TIMER_DATABASEQUERY instance
// nMsg => WM_TIMER
// nIDEvent => ID_TIMER_DATABASEQUERY, unless you also set other timers
// dwTime => elapsed time, same as value of GetTickCount()
AfxMessageBox(_T("Help"));
}

тогда вы можете настроить таймер следующим образом:

m_ptheWindow->SetTimer(ID_TIMER_DATABASEQUERY, 10000, CDatabaseApplicationApp::OnTimer)
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector