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
Funkcja zdarzeniowa - utworzenie własnego przycisku
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2440
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); //<----
...
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
Ale w jaki sposób mam odwołać się do funkcji zdarzeniowej klasy CFramework??
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
Abym mógł utworzyć przycisk z grafiką muszę odwołać się do głównej funkcji zdarzeniowej okna, to chyba nazywa się subclassing lub superclassing.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2440
Ech, przecież ButtonClass to zwykłe okno, a nie systemowy przycisk, całą obsługę dajesz w ButtonClass::WndProc.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
Nie oknem jest CFramework a ButtonClass jest (powinna być) klasą odpowiedzialną tylko i wyłącznie za utworzenie przycisku z grafiką.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2440
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).
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2440
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
To dlaczego po wprowadzeniu twoich poprawek w ogóle nie tworzy się przycisk?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2440
Trudno powiedzieć. Nie wiem, jak wstawiłeś te moje poprawki w kod klasy ButtonClass. Pokaż kod...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2440
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 102
Dobra dzięki, przeniosłem to do MainControlProc i działa :D. Pozdrawiam:D