Hawk » 22 июн 2004, 14:09
К сожалению CALLBACK-и могут быть только статическими методами класса.
Для обхода таких ограничений придумано множество способов которые используются и в MFC и в WTL. Но на практике проще применять один самый простой способ -
в обычном методе класса создаем окно следующим образом -
Последним параметром 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 в расчете что тела методов в обьявлении класса, это для наглядности. Там разберетесь куда лучше их засунуть
К сожалению CALLBACK-и могут быть только статическими методами класса.
Для обхода таких ограничений придумано множество способов которые используются и в MFC и в WTL. Но на практике проще применять один самый простой способ -
в обычном методе класса создаем окно следующим образом -
[code]
...
m_hWnd = CreateWindow(..., this);
...
[/code]
Последним параметром lpParam передаем указатель на класс.
Затем в статическом методе (указатель на который передан в WNDCLASS)-
[code]
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 )
{
....
}
[/code]
Где CMyClass - класс в котором оконная процедура обрабатывается. Я не присал [b]CMyClass[/b]::WndProc в расчете что тела методов в обьявлении класса, это для наглядности. Там разберетесь куда лучше их засунуть