Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Оконная процедура


Автор: Freeman 8.5.2005, 20:31
Есть один маленький вопросик: нельзя ли каким-либо способом сделать оконную процедуру методом класса?

Автор: Fixin 8.5.2005, 21:03
Код
class NewClass
{
     public:
     NewClass(HWND hwnd)
     {
                OldWndProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)NewWndProc);
    SetProp(hwnd, "tagnewclass", (void*)this);
     }
     ~NewClass(HWND hwnd)
     {
                RemoveProp(hwnd, "tagnewclass");
    SetWindowLong(hwnd, GWL_WNDPROC, (LONG)OldWndProc);
     }
     WNDPROC OldWndProc;
     friend LRESULT CALLBACK NewWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
};
LRESULT CALLBACK
NewWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    NewClass *ncls = (NewClass*)GetProp(hwnd, "tagnewclass");
    switch(Message)
    {
        HANDLE_MSG(hwnd, WM_PAINT, ncls->_OnPaint);//можно вне класса
        HANDLE_MSG(hwnd, WM_MOUSEMOVE, ncls->_OnMouseMove);
        HANDLE_MSG(hwnd, WM_LBUTTONUP, ncls->_OnLButtonUp);
        HANDLE_MSG(hwnd, WM_LBUTTONDOWN, ncls->_OnLButtonDown);
    }  
  return CallWindowProc(ncls->OldWndProc, hwnd, Message, wParam, lParam);
}

Автор: Leksey 10.5.2005, 22:25
Fixin ведь просили методом класса, а не дружественной функцией.
Можно, но только при этом ей поставить атрибут static.

Автор: Freeman 12.5.2005, 06:44
Вообще-то не хочется чтобы функция была статической, тогда ведь возникнут трудности при взаимодействии с членами класса.

Автор: Alastis 12.5.2005, 14:20
Цитата(Freeman @ 8.5.2005, 20:31)
нельзя ли каким-либо способом сделать оконную процедуру методом класса?

Только если метод статический. Тут нужно решить проблему как из статической функции получить доступ к нестатическим полям и методам класса.
В данном случае это можно сделать следующим образом:
В CreateWindowEx() последним параметром передавай указатель на класс
В оконной процедуре ловишь WM_NCCREATE и WM_CREATE . lParam - указатель, который ты передал CreateWindowEx(). Дальше сохраняешь этот указатель в статическом члене класса.
А если у тебя этих окон два или больше, то можно использовать то, что для каждого окна можно сохранить 32-битное число как userdata. А когда получаешь HWND, по нему получаешь число - GetWindowLong(), а число есть указатель куда тебе надо. Используешь reinterpret_cast<type*> и все

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)