create()创建的控件不能映射消息函数的解决
有时,使用create()在运行时创建的控件不能将消息映射到父窗口内,此时需要使用消息转发的机制,主要原理:注册一个全局的消息,针对接收消息的控件编写继承类,在该继承类中响应消息,并将已注册的全局消息转发给控件类的父窗口,在父窗口中响应该注册消息。
例:
定义一个继承自CTreeCtl的控件类:
class CSTreeCtrl : public CTreeCtrl
{
DECLARE_DYNAMIC(CSTreeCtrl)
public:
CSTreeCtrl();
virtual ~CSTreeCtrl();
void SetDialog(CDialog* pDia);
protected:
CDialog* m_pDia;
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
注册一个全局消息并响应控件的鼠标左键单击事件:
UINT TREE_SEL_MESSAGE = ::RegisterWindowMessage (_T("TREE_SEL_MESSAGE")); //字符串可以任意取,但一定要全局唯一。
IMPLEMENT_DYNAMIC(CSTreeCtrl, CTreeCtrl)
BEGIN_MESSAGE_MAP(CSTreeCtrl, CTreeCtrl)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
CSTreeCtrl::CSTreeCtrl()
{
}
CSTreeCtrl::~CSTreeCtrl()
{
}
void CSTreeCtrl::SetDialog(CDialog* pDia)
{
m_pDia = pDia;
}
void CSTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CTreeCtrl::OnLButtonDown(nFlags, point);
::PostMessage(m_pDia->m_hWnd,TREE_SEL_MESSAGE,NULL,NULL); //转发消息,这里发送消息后立即返回,并不等待消息回应。
//发送消息需要父窗口的窗口句柄从而路由消息,这里可以使用SetDialog传递一个父窗口
//的窗口类指针来获得.
}
在父窗口创建控件并相应注册消息:
Class CMyDlg : public CDialog
{
private:
CSTreeCtrl m_TreeCtrl1;
.........
DECLARE_MESSAGE_MAP()
.........
};
生成对注册消息的响应映射
IMPLEMENT_DYNCREATE(CMyDlg, CDialog)
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
......
ON_REGISTERED_MESSAGE(TREE_SEL_MESSAGE,TreeSel)
......
END_MESSAGE_MAP()
编写响应函数TreeSel,注意这个函数的参数类型要统一:
LRESULT CMyDlg::TreeSel(WPARAM wParam, LPARAM lParam) //这里的(WPARAM wParam, LPARAM lParam就是
//::PostMessage(m_pDia->m_hWnd,TREE_SEL_MESSAGE,NULL,NULL); 中的NULL,NULL
{
UserDefineFunction(...);
...
return 0;
}
浙公网安备 33010602011771号