Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

сделать callback функцию полем класса.

400
05 мая 2009 года
ArtemS2006
272 / / 12.01.2008
добрый день. такая проблемма:
есть класс, который содержит метод создания окна в платформе вин32. всё стандартно: используется структура WNDCLASS, которой передается адрес функции - обработчика сообщений:

 
Код:
void Graphics::Startup() {
  WNDCLASS winClass;
  //...
  winClass.lpfnWndProc = (WNDPROC)WndProc;
  //...
  RegisterClass(&winClass);
  //...
}


сейчас 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);
}


то есть фактически надо определить внутри статической функции, какой объект ее вызвал.

первая мысль - хранить статический массив ссылок на все объекты, у объектов хранить поле хэндла окна hWnd, и по входному параметру HWND hWnd статической функции WndProc вычислять объект, сравнивая его с полем хэндла окна hWnd в цикле.

может есть другие способы? а может можно как то сделать WndProc динамической?
3
05 мая 2009 года
Green
4.8K / / 20.01.2000
Уже НЕОДНОКРАТНО обсуждалось!
400
05 мая 2009 года
ArtemS2006
272 / / 12.01.2008
Цитата: Green
Уже НЕОДНОКРАТНО обсуждалось!



шо? снова баян?

87
05 мая 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: ArtemS2006
может есть другие способы? а может можно как то сделать WndProc динамической?



Первоисточник наверно надо искать по слову SetWindowLongPtr.

Тут обсуждается что-то подобное. Можно додумать по аналогии.

400
05 мая 2009 года
ArtemS2006
272 / / 12.01.2008
всем большое спасибо! вопрос исчерпан.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог