关于tr1::bind及tr1::function的用法,请参考:《function/bind的救赎》孟岩,http://blog.youkuaiyun.com/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;
};
本文介绍了C++ TR1中的bind和function的使用方法,结合实际工程案例,展示了如何在非窗口类中创建隐藏窗口,并将成员方法绑定到窗口消息处理函数上,适用于DirectUI库等场景。
5649

被折叠的 条评论
为什么被折叠?



