回 帖 发 新 帖 刷新版面

主题:[求助]关于MFC消息映射的问题

1、我在创建托盘程序时用代码创建了右键菜单:
menu.AppendMenu(MF_STRING,ID_SHOWWINDOW,_T("显示")); 
menu.AppendMenu(MF_STRING,WM_DESTROY,_T("关闭"));
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
菜单能正确显示,“关闭”菜单项能正确响应消息,关闭窗口;
我在头文件中添加“显示”的消息响应函数:
afx_msg void OnShow();
在CPP文件中增加消息定义和消息映射:
#define ID_SHOWWINDOW (WM_USER +1987)

BEGIN_MESSAGE_MAP(CTest0Dlg, CDialog)
    //{{AFX_MSG_MAP(CTest0Dlg)
    //}}AFX_MSG_MAP
    ON_MESSAGE(ID_SHOWWINDOW,MyShowWnd)
END_MESSAGE_MAP()
并在CPP文件加入消息处理函数:
void CTest0Dlg::MyShowWnd()
{
    this->ShowWindow(SW_SHOW);
    MessageBox("show window");
}
执行程序却得不到任何响应。

2、我用CTreeCtrl类创建了树型控件:
CTreeCtrl m_wndTree;
通过InsertItem函数建立了一些节点:
m_wndTree.InsertItem("节点1",0,0,0);
m_wndTree.InsertItem("节点2",0,0,0);
m_wndTree.InsertItem("节点3",0,0,0);
当用户鼠标改变这些节点的时候,我想增加一些消息响应处理,但不知道从哪里下手。
当我新建一个工程,利用资源视图创建树型控件,并使用ClassWizard增加消息响应函数得到:
BEGIN_MESSAGE_MAP(CTestdlgDlg, CDialog)
    //{{AFX_MSG_MAP(CTestdlgDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
我也照猫画虎,在我的工程中写入
BEGIN_MESSAGE_MAP(CTestdlgDlg, CDialog)
    //{{AFX_MSG_MAP(CTestdlgDlg)
    ON_NOTIFY(TVN_SELCHANGED, m_wndTree, OnSelchangedMyWndTree)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
并在头文件中加入消息响应函数声明,在CPP文件中加入消息处理函数,但出现了编译错误。

我在实验时出现了如上的问题,恳请高手们指点一二,不胜感激!

回复列表 (共3个回复)

沙发

m_wndTree.Create(WS_CHILD|WS_VISIBLE| TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT, 
        CRect(0,10,160,280),this, WM_TREE);
有了一些眉目,在创建CTreeCtrl对象时定义一个WM_TREE的ID,然后消息映射。
树型控件能响应消息,但内部的节点无法响应消息,比如TVN_SELCHANGED消息就无法响应。
在资源视图里创建的CTreeCtrl对象能响应这样的消息。

谁能帮我一下呀!!!

板凳

你加入的应该是注释宏里面的消息响应函数的原型吧?
有时候照猫画老虎是行不通的,你把那个宏去掉试一下额

3 楼

第一个问题:
并在CPP文件加入消息处理函数:
void CTest0Dlg::MyShowWnd()
{
    this->ShowWindow(SW_SHOW);
    MessageBox("show window");
}
执行程序却得不到任何响应

你定义的消息处理函数是什么?MyShowWnd()?

afx_msg void OnShow();这个?

我来回复

您尚未登录,请登录后再回复。点此登录或注册