Показать полную графическую версию : вопрос по WNDPROC
Вопрос в следующем:
можно ли указать функцию сишного класса, в качестве функции обработки сообщений виндового класса(WNDCLASSEX) ??
Формат "функции обработки сообщений" жестко задан:
для обычных окон (windows):
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
для диалогов (dialogs):
INT_PTR CALLBACK DialogProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
Или я Вас неправильно понимаю?
Netscaper
01-02-2005, 16:38
В классах бывают методы...:insane:
как я делаю (C++):
class QWindow {
HWND fhandle;
...
static long __stdcall WndProc(HWND, UINT, WPARAM, LPARAM);
public:
static void staticInit(); // register class
static void staticUinit(); // unregister class
}
void QWindow::staticInit()
{
WNDCLASSEX wcla = {sizeof(WNDCLASSEX), WNDPROC(WndProc), ...};
RegisterClassEx(&wcla);
}
Метод, определённый как static, отличается от остальных тем, что является обычной функцией с большими правами доступа, но в отличие от friend, находится в пространстве имён класса.
Проблемма была решена немного другим образом так как статические функции в данном случае не совсем то, что хотелось бы. Создавался дополнительный класс с данными и функциями которые мы планируем использовать в WNDPROC и после создания окна прицепляем указатель на объект дополнительного класса с помощью функции SetWindowLongPtr. Теперь дополнительные данные доступны в WNDPROC
Можно не создавать дополнительный класс. Можно сделать всё то же самое с использованием статического члена (всё-таки он правами обладает). В конструкторе собклассится какой-нибудь стандартный класс с DefWindowProc, а класс имеет следующую структуру:
class QWindow {
long __stdcall WndProc(...);
protected:
virtual bool process(long&, unsigned, long, long) = 0;
public:
QWindow(...)
{
...
SetWindowLong(..., long(this));
SetWindowLong(..., GWL_USERDATA, long(WndProc));
}
};
long __stdcall QWindow::WndProc(...)
{
QWindow* ptr = GetWindowLong(...);
long result;
if (!ptr->process(...)) result = DefWindowProc(...);
return result;
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC