class WndFrame{
public:
CreateWin();
private:
static LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
LRESULT WindowProcInternal (HWND, UINT, WPARAM, LPARAM);
};
WndFrame::CreateWind()
{
WNDCLASSEX wcl;
wcl.lpfnWndProc = &WindowProc;
}
LRESULT CALLBACK WndFrame::WindowProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
WndFrame *this_ptr;
if (msg == WM_INITDIALOG)
{
// lp содержит указатель this. Сохраним в WindowLong
this_ptr = (WndFrame*)lp;
SetLastError(0);
::SetWindowLong (hwnd, DWL_USER, (LONG)lp);
if (::GetLastError() != 0)
throw_system_error();
return this_ptr->WindowProcInternal (hwnd, msg, wp, lp);
}
else
{
this_ptr = (WndFrame*)::GetWindowLong (hwnd, DWL_USER);
if (this_ptr == NULL)
throw exception ("Unknown error");
return this_ptr->WindowProcInternal (hwnd, msg, wp, lp);
}
}
LRESULT WndFrame::WindowProcInternal (HWND, UINT, WPARAM, LPARAM)
{
// Это уже нестатическая функция, так что имеется this, можно обращаться к данным объекта
}
Указатель на функцию в классе
public:
CreateWin();
private:
WNDCLASSEX wcl;
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
};
WndFrame::CreateWind()
{
wcl.lpfnWndProc=?
}
Не понятно как задать указатель на функцию,которая определена в классе?Функции как токовой нет еще,обьект еще не создан ведь.
Цитата: Gfunk
Функции как токовой нет еще,обьект еще не создан ведь.
А как ты вызовешь не статик функцию без создания объекта?
у структуры wcl обьекта в поле lpfnWndProc был указатель на процедуру окна,которая тоже принадлежит этому обьекту.
А вообще я конечно таким заморочками не пользуюсь, но должно работать так:
wcl.lpfnWndProc = &WndFrame::WindowProc;
Цитата: Gfunk
Ну я ее не вызываю до создания обьекта,я хочу чтоб когда я создам обьект
у структуры wcl обьекта в поле lpfnWndProc был указатель на процедуру окна,которая тоже принадлежит этому обьекту.
у структуры wcl обьекта в поле lpfnWndProc был указатель на процедуру окна,которая тоже принадлежит этому обьекту.
1. "Процедуру окна, которая тоже принадлежит этому объекту" ты ни описать, ни указать ее адрес в lpfnWndProc не сможешь. Одна и та же процедура окна вызывается для всех окон этого класса.
2. Функцию надо объявить статиком.
Короче, вот отрывок из моего проекта, адаптированный под твой код.
Код:
Цитата: cheburator
1. "Процедуру окна, которая тоже принадлежит этому объекту" ты ни описать, ни указать ее адрес в lpfnWndProc не сможешь. Одна и та же процедура окна вызывается для всех окон этого класса.
Ну это не совсем так. Смотрим, как устроена эта функциональность в WTL.