Procedura okna w klasie

Nightzom
2014-04-28 18:48
Nightzom
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;

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

Nightzom
2014-04-28 19:19
Nightzom
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?

Pozostało 580 znaków

2014-04-28 21:36

Rejestracja: 10 lat temu

Ostatnio: 14 godzin temu

Lokalizacja: Redmond, WA

0

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


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2014-04-28 23:24

Rejestracja: 16 lat temu

Ostatnio: 3 minuty temu

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);
}
edytowany 1x, ostatnio: Azarien, 2014-04-28 23:26

Pozostało 580 znaków

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