Оконные классы
Есть класс создающий окно, один из его членов указываеться как функция CALLBACK. Чтобы ОС передавала сообщения эта функция должна быть статической. В классе храняться некотрые свойства окна, поэтому нужен нестатический обработчик сообщений ...
Как быть ? Ведь статическая функция не имеет доступа к переменным и методам класса.
Как можно организовать по-другому приём сообщений в классе ?
Можно ли каким-нибудь способом вызвать из статической функции метод класса ?
LRESULT CALLBACK CWindow::WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CWindow* cls = (CWindow*)GetWindowLong(hwnd, 0);//вот и все дела
switch (message) {
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC DC = BeginPaint(hwnd, &ps);
cls->OnPaint(DC, ps.rcPaint);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam );
}
Кроме того эта конструкция может и не заработать.
Хорошенько всё обмозговав я нашёл решение и оставляю его тут,
вдруг кому пригодиться ...
class SC {
public :
SC();
~SC();
virtual bool Create(HWND parent, int x, int y, int w, int h, char *name);
static LRESULT CALLBACK SXStaticProc(HWND, UINT, WPARAM, LPARAM);
virtual LRESULT SXProc(HWND, UINT, WPARAM, LPARAM);
char *name;
HWND handle;
};
//имя свойства
#define THIS_PROP _T("this")
//Статический обработчик для системы
LRESULT CALLBACK SC::SXStaticProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
LRESULT lResult;
SC *me = (SC *)GetProp(hWnd, THIS_PROP);
if(!me) {
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
lResult = me->SXProc(hWnd, uMsg, wParam, lParam); //Свой обработчик класса
if(uMsg == WM_DESTROY) {
RemoveProp(hWnd, THIS_PROP);
}
return lResult;
}
bool SXBase::Create(HWND parent, int x, int y, int w, int h, char *name) {
//Создаём окно, хвнд сохраняем в SС::handle
SetProp(SС::handle, THIS_PROP, this);
return true;
}
SetProp использовать лучше чем Get/SetWindowLong - Long значение может пригодиться в других случаях ...