C2440 Не удается преобразовать LRESULT в WNDPROC в C ++ WinApi - PullRequest
9 голосов
/ 06 сентября 2011

Я пытаюсь написать эту программу для Win32 с WinApi, и я застрял, потому что у учебника, которому я следую, есть проблема.

mainwindow.h:

class MainWindow
{
  public:
    MainWindow(HINSTANCE);
   ~MainWindow(void);

    LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

    // [...]

mainwindow.cpp:

MainWindow::MainWindow(HINSTANCE hInstance) : hwnd(0)
{
  WNDCLASSEX WndClsEx;
  // [...]
  WndClsEx.lpfnWndProc = &MainWindow::WndProcedure;
  // [...]
}

LRESULT CALLBACK MainWindow::WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  // [...]
}

Я должен ссылаться на MainWindow :: WndProcedure неправильно, потому что я следую подписи именно так, как сказано в учебнике, однако строка lpfnWndProc в конструкторе выдает ошибку времени компиляции:

ошибка C2440: '=': невозможно преобразовать из 'LRESULT (__stdcall MainWindow :: *) (HWND, UINT, WPARAM, LPARAM)' в 'WNDPROC'

Ответы [ 3 ]

14 голосов
/ 06 сентября 2011

заменить

LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

по

static LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

Указатель this является скрытым параметром в вызове функции, и, объявив его статическим, указатель this больше не является параметром, и сигнатура двух функций совпадает.

4 голосов
/ 06 сентября 2011

Это потому, что ваша функция WndProcedure должна быть либо глобальной, либо статической функцией-членом.

4 голосов
/ 06 сентября 2011

Нельзя использовать нестатическую функцию-член в качестве оконной процедуры. Если вы объявите WndProcedure как static, он должен скомпилироваться. Функция, не являющаяся членом, также будет работать.

Нестатические функции-члены имеют подпись, отличную от статических. Это потому, что они получают неявный параметр this в дополнение к явно определенным параметрам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...