Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   вопрос по WNDPROC (http://forum.oszone.net/showthread.php?t=44655)

sicha 29-01-2005 23:33 293527

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

Savant 31-01-2005 23:41 294157

Формат "функции обработки сообщений" жестко задан:

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

В классах бывают методы...:insane:

pva 08-02-2005 13:18 296352

как я делаю (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 296445

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

pva 14-02-2005 13:28 298200

Можно не создавать дополнительный класс. Можно сделать всё то же самое с использованием статического члена (всё-таки он правами обладает). В конструкторе собклассится какой-нибудь стандартный класс с 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;
}



Время: 11:58.

Время: 11:58.
© OSzone.net 2001-