2017-01-24 10 views
1

Я хочу получить доступ к членам пользовательского класса из метода обратного вызова.Как получить доступ к пользовательским членам класса из метода обратного вызова

Я обращаюсь к m_displayImg->bIsPressAndHold = true; от функций обратного вызова.

т.е.

Это дает ошибку "Идентификатор M_displayImg не определен".

class CDisplayImage 
{ 
public: 
    CDisplayImage(void); 
    virtual ~CDisplayImage(void); 

    int Initialize(HWND hWnd, CDC* dc, IUnknown* controller); 
    void Uninitialize(int context); 
    BOOL bIsPressAndHold = false; 
    //code omitted 
}; 


VOID CALLBACK DoCircuitHighlighting(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) 
{ 
    m_displayImg->bIsPressAndHold = true;  
    // I have omitted code for simplicity. 
} 

Как я могу получить доступ к этому пользовательскому члену класса?

+1

Во-первых, см [Minimal, Complete, Проверяемость Пример] (http://stackoverflow.com/help/mcve). Во-вторых: типичный способ проскальзывания параметров (например, связанный класс) с обратными вызовами Windows без использования глобальных переменных заключается в [помещать их в поле HWND GWL_USERDATA] (http://stackoverflow.com/q/14883556/211160). – HostileFork

+0

@HostileFork Сэр, я изменил вопрос. –

+0

[код, добавленный вами] (http://stackoverflow.com/revisions/41820817/2) не имеет особого значения, поскольку он не отображает класс, который содержит 'm_displayImg' или' m_startPoint'. Это * тот * класс, который вы хотели бы связать с HWND, предположительно. Независимо от того, что этот класс, это тот, где вы сохранили бы свой указатель в GWL_USERDATA HWND (когда он получит свой HWND, созданный или переданный), а затем извлеките указатель из параметра 'hwnd' DoCircuitHighlighting, когда он вызывается. – HostileFork

ответ

0

Раньше я столкнулся с аналогичной проблемой. Я решил это с переменной namespaced, потому что функция CALLBACK не может принимать больше параметров, вы даже не можете поместить ничего в список захвата лямбда.

Мой пример кода (разное содержание, но суть остается той же):

#include <windows.h> 
#include <algorithm> 
#include <vector> 

namespace MonitorInfo { 
    // namespace variable 
    extern std::vector<MONITORINFOEX> data = std::vector<MONITORINFOEX>(); 

    // callback function 
    BOOL CALLBACK callbackFunction(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { 
     MONITORINFOEX monitorInfo; 
     monitorInfo.cbSize = sizeof(monitorInfo); 
     GetMonitorInfo(hMonitor, &monitorInfo); 
     data.push_back(monitorInfo); 
     return true; 
    } 

    // get all monitors data 
    std::vector<MONITORINFOEX> get(){ 
     data.clear(); 
     EnumDisplayMonitors(NULL, NULL, callbackFunction, 0); 
     return data; 
    } 
}; 

int main(){ 
    auto info = MonitorInfo::get(); 
    printf("%d", info.size()); 
    return 0; 
}