Procedura okna w klasie

0

Witam,

Utworzyłem klasę aplikacji i zaimplementowałem w niej metody inicjalizacji i działania. Okno główne posiada kilka kontrolek, ich uchwyty zdefiniowałem jako pola prywatne klasy aplikacja. Jednak gdy chciałem dodać metodę procedury okna do klasy, tj:

//metoda publiczna w klasie "okno" - deklaracja w pliku naglowkowym

LRESULT CALLBACK wndproc(HWND hWindow, UINT message, WPARAM wparam, LPARAM lparam);

//metoda publiczna w klasie "okno" - definicja w pliku zrodlowym

LRESULT CALLBACK okno::wndproc(HWND hWindow, UINT message, WPARAM wparam, LPARAM lparam)
{
//...
}

Kompilator wyrzuca błąd:

Error 1 error C3867: 'okno::wndproc': function call missing argument list;

0

Chyba znalazłem rozwiązanie - procedurę okna jako metodę klasy należy uczynić statyczną (dopisać static) jednak mógłby mi ktoś wyjaśnić dlaczego?

0

Niestytyczne metody mają niejawnie dodatkowy parametr (this), ten parametr powoduje, że funkcja jest niekompatybilna z WinAPI

1

Chyba znalazłem rozwiązanie
Jeszcze ci daleko do rozwiązania, bo w ten sposób wszystko musiałbyś mieć static, co w zasadzie przeczy idei klasy.

Niestytyczne metody mają niejawnie dodatkowy parametr (this), ten parametr powoduje, że funkcja jest niekompatybilna z WinAPI.
Moment, powoli.

Z oknem (HWND) można powiązać wskaźnik na cokolwiek, za pomocą funkcji SetWindowLongPtr i GetWindowLongPtr.
Można tam podać (void*)this i w ten sposób w funkcji globalnej albo statycznej WndProc wyciągnąć obiekt, z którym powiązane jest okno.

LRESULT CALLBACK StaticWndProc(HWND hWindow, bla bla bla) // metoda statyczna
{
    // oczywiście po utworzeniu okna musiało być SetWindowLongPtr
    okno *that = (okno*)GetWindowLongPtr(hWindow, GWLP_USERDATA);
    if (that != nullptr)
        return that->WndProc(hWindow, bla bla bla); // metoda niestatyczna
    else
        return DefWindowProc(hWindow, bla bla bla);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1