PDA

Показать полную графическую версию : вопрос по WNDPROC


sicha
29-01-2005, 23:33
Вопрос в следующем:
можно ли указать функцию сишного класса, в качестве функции обработки сообщений виндового класса(WNDCLASSEX) ??

Savant
31-01-2005, 23:41
Формат "функции обработки сообщений" жестко задан:

для обычных окон (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:

pva
08-02-2005, 13:18
как я делаю (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, находится в пространстве имён класса.

sicha
08-02-2005, 16:53
Проблемма была решена немного другим образом так как статические функции в данном случае не совсем то, что хотелось бы. Создавался дополнительный класс с данными и функциями которые мы планируем использовать в WNDPROC и после создания окна прицепляем указатель на объект дополнительного класса с помощью функции SetWindowLongPtr. Теперь дополнительные данные доступны в WNDPROC

pva
14-02-2005, 13:28
Можно не создавать дополнительный класс. Можно сделать всё то же самое с использованием статического члена (всё-таки он правами обладает). В конструкторе собклассится какой-нибудь стандартный класс с 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