Funkcja zdarzeniowa - utworzenie własnego przycisku

0

Witam,
posiadam klasę główną która tworzy okno, obsługuje zdarzenia, itp... Posiadam też klasę odpowiedzialną za utworzenie przycisku z własną teksturą. Mój problem polega na tym, że nie wiem do końca w jaki sposób mam przekazać pierwszy parametr w CallWindowProc().
W klasie podstawowej funkcja zdarzeniowa jest statyczna i publiczna. Proszę o jakąś podpowiedź.
Tutaj podaję link jeżeli nie wyraziłem się zbyt jasno :D:
http://speedy.sh/xHuMq/Launcher.zip

1

Globalny wskaźnik pButton powoduje, że tylko jedna instancja klasy ButtonClass będzie działać.

LRESULT  ButtonClass::ControlProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    WNDPROC g_oldWnd = (WNDPROC)SetWindowLong(pFrame->GetWindow(), GWL_WNDPROC, (LONG)CFramework::WndProc);
    ...
    

        return CallWindowProc(g_oldWnd, hWnd, Msg, wParam, lParam);
};

Ten fragment jest bez sensu. Po co to w ogóle w procedurze przycisku?

Zrobiłbym to tak:

class ButtonClass
{
private:
    LRESULT WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
        /* procedura obsługi dla konkretnej instancji klasy ButtonClass */
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }

    ...
};



LRESULT  ButtonClass::ControlProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    if(Msg == WM_CREATE)
    {
        CREATESTRUCT *pcs = (CREATESTRUCT*)lParam;
        SetWindowLongPtr(hWnd, GWLP_USERDATA, pcs->lpCreateParams);
        return 0;            
    }    
        
    ButtonClass* _this = (ButtonClass*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    if(_this) return _this->WndProc(hWnd, Msg, wParam, lParam);
    return DefWindowProc(hWnd, Msg, wParam, lParam);
}


bool ButtonClass::CreateButton(...)
{
    ...

    HWND hButtom = CreateWindowEx(0, 
                    L"PRZYCISK", 
                    NULL, 
                    WS_CHILD | WS_VISIBLE, 
                    nX, 
                    nY, 
                    nWidth, 
                    nHeight, 
                    hWnd, 
                    (HMENU)ID, 
                    hInstance, 
                    this);             //<----
        
    ...
}
0

Ale w jaki sposób mam odwołać się do funkcji zdarzeniowej klasy CFramework??

0

Chyba nie rozumiem pytania...

0

Abym mógł utworzyć przycisk z grafiką muszę odwołać się do głównej funkcji zdarzeniowej okna, to chyba nazywa się subclassing lub superclassing.

0

Ech, przecież ButtonClass to zwykłe okno, a nie systemowy przycisk, całą obsługę dajesz w ButtonClass::WndProc.

0

Nie oknem jest CFramework a ButtonClass jest (powinna być) klasą odpowiedzialną tylko i wyłącznie za utworzenie przycisku z grafiką.

0

Nie wiem, czy to kwestia wieczornej pory, czy może Twoich niejasnych pytań, ale cały czas nie wiem, o co pytasz. Co to znaczy, że musisz odwołać się do funkcji zdarzeniowej okna (w domyśle CFramework), żeby stworzyć przycisk z bitmapą? Nic nie musisz. Przycisk jest tworzony przy inicjacji "frameworka" (vide CGame::Init). Subklasować też nic nie musisz, bo jak pisałem, Twój przycisk to zwykle okno (child window z własną klasą okna), a nie przycisk systemowy (czyli okno klasy BUTTON).

0

Wiem nie potrafię zbyt jasno opisać o co mi chodzi. W takim razi odpowiem linkiem :
http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Kontrolki/Wlasne-kontrolki-cz-2/211

0

Link niewiele wniósł do tematu, bo to tylko przykład tworzenia kontrolki od zera. Tam nie ma niczego ponad to, co jest już w Twoim(?) kodzie.

0

To dlaczego po wprowadzeniu twoich poprawek w ogóle nie tworzy się przycisk?

0

Trudno powiedzieć. Nie wiem, jak wstawiłeś te moje poprawki w kod klasy ButtonClass. Pokaż kod...

0

Tak jak myślałem. Wprowadź poprawki dokładnie tak jak napisałem. Oczywiście obsługę musisz przenieść do MainControlProc. Zwracam uwagę na ostatni parametr CreateWindowEx.

Wywal też CreateWindowEx z RegisterButton - te wywołania SetClassLong są zupełnie zbędne, ponieważ hdcMem, hbmBmp i hbmMask mogą być polami klasy ButtonClass.

0

Dobra dzięki, przeniosłem to do MainControlProc i działa :D. Pozdrawiam:D

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