Сохранение указателя на класс в USERDATA
От: cupuyc  
Дата: 28.07.09 20:33
Оценка:
Собственно создаю окошко и хочу чтобы мой класс обрабатывал сообщения:


    if (msg == WM_CREATE)
    {
        CREATESTRUCT    *p_create_ctruct = (CREATESTRUCT*)lp;
        CMyWndClass    *p_wnd = (CMyWndClass*)p_create_ctruct->lpCreateParams;

        SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)p_wnd);

        return    p_wnd->on_create(p_create_ctruct);
    }

    if (CMyWndClass *p_wnd = (CMyWndClass*)GetWindowLongPtr(hwnd, GWLP_USERDATA))
    {
        return    p_wnd->on_window_message(msg, wp, lp);
    }

    return    DefWindowProc(hwnd, msg, wp, lp);


меня интересует насколько сильно это отразится на производительности? получается что для каждого сообщения дёргается GetWindowLongPtr. я глянул на код этой апишки — системные вызовы она, вроде, не дёргает, т.е. работать должна довольно быстро. да и окошко — не заметно чтоб притормаживала отрисовка. но всё же, насколько такой способ приемлем и есть ли более разумные варианты?
Re: Сохранение указателя на класс в USERDATA
От: SharpC  
Дата: 29.07.09 07:32
Оценка:
Здравствуйте, cupuyc, Вы писали:

C>меня интересует насколько сильно это отразится на производительности? получается что для каждого сообщения дёргается GetWindowLongPtr. я глянул на код этой апишки — системные вызовы она, вроде, не дёргает, т.е. работать должна довольно быстро. да и окошко — не заметно чтоб притормаживала отрисовка. но всё же, насколько такой способ приемлем и есть ли более разумные варианты?


Такой способ используется часто, но MFC, например, не использует CREATESTRUCT, а кладет this в TLS и вытаскивает его в хуке на создание окна, после чего кладет hWnd -> this в аналог hash_map.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.