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

posted on 2016-12-30 13:26  CaiChong  阅读(115)  评论(0)    收藏  举报

导航