Как объявить функцию LRESULT CALLBACK(она же WNDPROC)

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

22 июн 2004, 13:52

Как объявить функцию LRESULT CALLBACK(она же WNDPROC) как член класса(собственно написаный класс)?
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

22 июн 2004, 13:58

И ещё вопрос:
объявление функции члена класса
LRESULT CALLBACK DlgPath: :D lgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
определение функции члена класса
LRESULT CALLBACK DlgPath: :D lgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return 0;
}

кусок кода:

wcex.lpfnWndProc = (WNDPROC) Proc;

а вот как оно ругается:
error C2440: 'type cast' : cannot convert from '' to 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

22 июн 2004, 14:09

К сожалению CALLBACK-и могут быть только статическими методами класса.
Для обхода таких ограничений придумано множество способов которые используются и в MFC и в WTL. Но на практике проще применять один самый простой способ -
в обычном методе класса создаем окно следующим образом -

Код: Выделить всё

...
m_hWnd = CreateWindow(..., this); 
...
Последним параметром lpParam передаем указатель на класс.
Затем в статическом методе (указатель на который передан в WNDCLASS)-

Код: Выделить всё

static LRESULT CALLBACK s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  if (uMsg == WM_CREATE)
  {
     LPCREATESTRUCT pCS = (LPCREATESTRUCT)lParam;
     ::SetWindowLong(hwnd, GWL_USERDATA, (DWORD)pCS->lpCreateParams); //Запоминаем переданный указатель на класс
  }
  CMyClass* pThis = (CMyClass*)::GetWindowLong(hwnd, GWL_USERDATA); //берем его 
  if (pThis)
    return pThis->WndProc(hwnd, uMsg, wParam, lParam); // вызываем обычный (не static метод)
  else
    return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
}

//вот и он обычный метод
LRESULT WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  ....
}

Где CMyClass - класс в котором оконная процедура обрабатывается. Я не присал CMyClass::WndProc в расчете что тела методов в обьявлении класса, это для наглядности. Там разберетесь куда лучше их засунуть
Ответить