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

Ваш аккаунт

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

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

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

Оконные классы

6.2K
09 февраля 2004 года
warg
3 / / 08.02.2004
Вот такая ситуация :
Есть класс создающий окно, один из его членов указываеться как функция CALLBACK. Чтобы ОС передавала сообщения эта функция должна быть статической. В классе храняться некотрые свойства окна, поэтому нужен нестатический обработчик сообщений ...
Как быть ? Ведь статическая функция не имеет доступа к переменным и методам класса.
Как можно организовать по-другому приём сообщений в классе ?
Можно ли каким-нибудь способом вызвать из статической функции метод класса ?
2.6K
09 февраля 2004 года
Hearse
89 / / 19.01.2004
В случае окна можно ивернуться след. образом:

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 );
}
6.2K
09 февраля 2004 года
warg
3 / / 08.02.2004
Огромное спасибо за подсказку, но задача немного другая.
Кроме того эта конструкция может и не заработать.
Хорошенько всё обмозговав я нашёл решение и оставляю его тут,
вдруг кому пригодиться ...

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 значение может пригодиться в других случаях ...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог