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

- Rejestracja:prawie 13 lat
- Ostatnio:ponad 6 lat
- Postów:102
- Rejestracja:prawie 20 lat
- Ostatnio:około rok
- 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:prawie 13 lat
- Ostatnio:ponad 6 lat
- Postów:102
Ale w jaki sposób mam odwołać się do funkcji zdarzeniowej klasy CFramework??

- Rejestracja:prawie 13 lat
- Ostatnio:ponad 6 lat
- 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:prawie 13 lat
- Ostatnio:ponad 6 lat
- Postów:102
Nie oknem jest CFramework a ButtonClass jest (powinna być) klasą odpowiedzialną tylko i wyłącznie za utworzenie przycisku z grafiką.
- Rejestracja:prawie 20 lat
- Ostatnio:około rok
- 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:prawie 13 lat
- Ostatnio:ponad 6 lat
- 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:prawie 13 lat
- Ostatnio:ponad 6 lat
- Postów:102
To dlaczego po wprowadzeniu twoich poprawek w ogóle nie tworzy się przycisk?

- Rejestracja:prawie 13 lat
- Ostatnio:ponad 6 lat
- Postów:102
- Rejestracja:prawie 20 lat
- Ostatnio:około rok
- 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:prawie 13 lat
- Ostatnio:ponad 6 lat
- Postów:102
Dobra dzięki, przeniosłem to do MainControlProc i działa :D. Pozdrawiam:D