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

本文介绍了C++ TR1中的bind和function的使用方法,结合实际工程案例,展示了如何在非窗口类中创建隐藏窗口,并将成员方法绑定到窗口消息处理函数上,适用于DirectUI库等场景。

关于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;
};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值