2017-01-24 6 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

は、(http://stackoverflow.com/help/mcve)検証可能例、完全、最小]を参照。第2に、グローバル変数を使用せずにパラメータ(例:関連するクラス)を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に関連付けることを望むクラスです。そのクラスが何であれ、HWNDのGWL_USERDATAにポインタを保存し(HWNDが作成または渡されたとき)、DoCircuitHighlightingの 'hwnd'パラメータからポインターを取り出します。 – HostileFork

答えて

0

これまで同様の問題が発生しました。 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; 
} 
関連する問題