tr1::bind与tr1::function的用法与具体应用

来源:互联网 发布:从零开始学淘宝txt 编辑:程序博客网 时间:2024/04/28 20:32

关于tr1::bind及tr1::function的用法,请参考:《function/bind的救赎》孟岩,http://blog.csdn.net/myan/article/details/5928531

以下是实际工程中的代码,用于非窗口类(比如DirectUI库的页面类,这些类并不包含可以用来接收消息的m_hWnd成员)创建一个隐藏窗口,并绑定其成员方法到这个隐藏窗口的消息处理函数上。

class CMessageWindow{protected:CMessageWindow() : m_hWnd(NULL), m_OldWndProc(NULL){}~CMessageWindow(){_ASSERT(!IsWindow(m_hWnd));}BOOL Create(LPCWSTR lpClassName = L"#32770"){if(lpClassName == NULL || wcslen(lpClassName) == 0)return FALSE;_ASSERT(m_hWnd == NULL);m_hWnd = CreateWindowEx(0, lpClassName, NULL, WS_POPUP, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);if(m_hWnd == NULL){_ASSERT(FALSE);return FALSE;}SetWindowLongPtr(m_hWnd, GWLP_USERDATA, (LONG_PTR)this);m_OldWndProc = (WNDPROC)SetWindowLongPtr(m_hWnd, GWLP_WNDPROC, (LONG_PTR)MyWndProc);return TRUE;}BOOL Destroy() CONST{return DestroyWindow(m_hWnd);}template <typename T>BOOL BindHandler(UINT uMsg, T Function){if(uMsg < WM_USER)return FALSE;m_Handler[uMsg] = std::tr1::bind(Function, std::tr1::placeholders::_1, std::tr1::placeholders::_2);return TRUE;}template <typename T, typename CLASS>BOOL BindHandler(UINT uMsg, T Function, CLASS *lpClass){if(uMsg < WM_USER || lpClass == NULL)return FALSE;m_Handler[uMsg] = std::tr1::bind(Function, lpClass, std::tr1::placeholders::_1, std::tr1::placeholders::_2);return TRUE;}protected:HWND m_hWnd;private:static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){CMessageWindow *pThis = (CMessageWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA);LRESULT lResult = 0;if(uMsg >= WM_USER){std::map<UINT, std::tr1::function<LRESULT(WPARAM, LPARAM)>>::const_iterator Pair = pThis->m_Handler.find(uMsg);if(Pair != pThis->m_Handler.end()){lResult = Pair->second(wParam, lParam);}}else{lResult = CallWindowProc(pThis->m_OldWndProc, hWnd, uMsg, wParam, lParam);}return lResult;}private:WNDPROC m_OldWndProc;std::map<UINT, std::tr1::function<LRESULT(WPARAM, LPARAM)>> m_Handler;};


0 0
原创粉丝点击