windows - C2440 Kan ikke konvertere LRESULT til WNDPROC i C ++ WinApi

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at skrive dette win32-program med WinApi og jeg er fast, fordi den vejledning jeg følger synes at have et problem.


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)
{
  // [...]
}


Jeg skal referere MainWindow :: WndProcedure forkert, fordi jeg følger underskriften nøjagtigt som tutorialen siger, men lpfnWndProc linien i konstruktøren giver en kompileringstid fejl:


fejl C2440: '=': kan ikke konverteres fra 'LRESULT (\_\_stdcall MainWindow :: *) (HWND, UINT, WPARAM, LPARAM)' til 'WNDPROC'

Bedste reference


erstatte


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


ved


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


Denne peger er en skjult parameter i dit funktionsopkald, og ved at erklære det statisk, er denne peger ikke en parameter længere, og signaturen af ​​de to funktioner matcher.

Andre referencer 1


Det skyldes, at din WndProcedure-funktion skal være enten en global funktion eller en statisk medlemsfunktion.

Andre referencer 2


Du kan ikke bruge en ikke-statisk medlemsfunktion som en vindueprocedure. Hvis du erklærer WndProcedure som static, skal den kompilere. En ikke-medlemsfunktion vil også fungere.


Ikke-statiske medlemsfunktioner har en anden signatur end statiske medlemmer. Dette skyldes, at de modtager en implicit this parameter ud over de eksplicit definerede parametre.