void Graphics::Startup() {
WNDCLASS winClass;
//...
winClass.lpfnWndProc = (WNDPROC)WndProc;
//...
RegisterClass(&winClass);
//...
}
сделать callback функцию полем класса.
есть класс, который содержит метод создания окна в платформе вин32. всё стандартно: используется структура WNDCLASS, которой передается адрес функции - обработчика сообщений:
Код:
сейчас WndProc - это статическая функция класса:
Код:
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Динамической, как я понимаю, ее сделать не получится, так как жестко задан прототип WNDPROC.
есть необходимость обрабатывать внутри WndProc код в зависимости от того, какой экземпляр класса вызвал WndProc, например:
Код:
LRESULT CALLBACK Graphics::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CREATE: {
//код в зависимости от вызвавшего объекта.
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
switch (uMsg) {
case WM_CREATE: {
//код в зависимости от вызвавшего объекта.
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
то есть фактически надо определить внутри статической функции, какой объект ее вызвал.
первая мысль - хранить статический массив ссылок на все объекты, у объектов хранить поле хэндла окна hWnd, и по входному параметру HWND hWnd статической функции WndProc вычислять объект, сравнивая его с полем хэндла окна hWnd в цикле.
может есть другие способы? а может можно как то сделать WndProc динамической?
Уже НЕОДНОКРАТНО обсуждалось!
Цитата: Green
Уже НЕОДНОКРАТНО обсуждалось!
шо? снова баян?
Цитата: ArtemS2006
может есть другие способы? а может можно как то сделать WndProc динамической?
Первоисточник наверно надо искать по слову SetWindowLongPtr.
Тут обсуждается что-то подобное. Можно додумать по аналогии.
всем большое спасибо! вопрос исчерпан.