2013-06-18 165 views
1

我有兩個類,Win32和引擎。我試圖將我的WindowProc函數從我的Engine類傳遞給Win32類。我知道的typedef WNDPROC聲明爲:將非靜態函數指針傳遞給另一個類?

typedef LRESULT(CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM); 

我的Win32頭被聲明爲:

// Win32.h 
#include <Windows.h> 

class Win32 
{ 
    public: 
     Win32() {}; 
     ~Win32() {}; 

     void Initialize(WNDPROC); 

    private: 
     // Route messages to non static WindowProc that is declared in Engine class. 
     static LRESULT CALLBACK MessageRouter(HWND, UINT, WPARAM, LPARAM); 
}; 

我的引擎類被聲明爲:

// Engine.h 
#include "Win32.h" 

class Engine 
{ 
    public: 
     Engine() {}; 
     ~Engine() {}; 

     void Initialize(); 

    private: 
     LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 

     Win32* m_win32; 
}; 


// Engine.cpp 
#include "Engine.h" 

void Engine::Initialize() 
{ 
    m_win32 = new Win32; 
    m_win32->Initialize(&WindowProc); // How can I pass this function without making 
             // it static or global. 
} 

我的Win32類已經有一個給WNDCLASSEX的靜態MessageRouter。所以我的問題是,如何將Engine :: WindowProc函數傳遞給Win32類而不聲明它是靜態的還是全局的?

+0

它有五個參數,'WNDPROC'有四個參數。你打算如何處理這個問題? – chris

回答

1

您可以使用std::functionstd::bind()(在C++ 11中)或boost::functionboost::bind()(在C++ 03中)。這兩者在功能上非常相當,所以我將展示使用std::bind()

這裏是你能怎麼定義上std::function基於稱爲WNDPROC_FXN一個類型別名:

typedef std::function<LRESULT CALLBACK (HWND, UINT, WPARAM, LPARAM)> WNDPROC_FXN; 

這是你將如何使用它在你的Win32類:

class Win32 
{ 
public: 
    Win32() {}; 
    ~Win32() {}; 

    void Initialize(WNDPROC_FXN); 
//     ^^^^^^^^^^^ 

private: 
    // Route messages to non static WindowProc that is declared in Engine class. 
    static LRESULT CALLBACK MessageRouter(HWND, UINT, WPARAM, LPARAM); 
}; 

這是怎麼了會將成員函數綁定到this指針並將其傳遞給Win32::Initialize()

#include <functional> 

// ... 

void Engine::Initialize() 
{ 
    using namespace std::placeholders; 

    m_win32 = new Win32; 
    m_win32->Initialize(std::bind(&Engine::WindowProc, this, _1, _2, _3 _4); 
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
} 
1

爲了完整起見,還有一種方法可以用語言結構來完成。此實現使用指向成員函數的指針:

// Win32.h 
#include <Windows.h> 

class Engine; 

class Win32 
{ 
    public: 
     Win32() {}; 
     ~Win32() {}; 

     void Initialize(LRESULT(CALLBACK Engine::* function)(HWND, UINT, WPARAM, LPARAM)); 

    private: 
     // Route messages to non static WindowProc that is declared in Engine class. 
     static LRESULT CALLBACK MessageRouter(HWND, UINT, WPARAM, LPARAM); 
}; 

class Engine 
{ 
    public: 
     Engine() {}; 
     ~Engine() {}; 

     void Initialize(); 

    private: 
     LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 

     Win32* m_win32; 
}; 

void Engine::Initialize() 
{ 
    m_win32 = new Win32; 
    m_win32->Initialize(&Engine::WindowProc); // How can I pass this function without making 
               // it static or global. 
} 

int main(void) 
{ 
    Engine engine; 

    engine.Initialize(); 

    return 0; 
} 
相關問題