现在的位置: 首页 > 综合 > 正文

如何在doc里面响应自定义消息?

2013年07月29日 ⁄ 综合 ⁄ 共 1380字 ⁄ 字号 评论关闭

虽然在doc里面响应“自定义消息”在“理论”上是不可能的,但是,我们可以通过别的方式实现。当然,这个缺点就是不能传递参数给Doc的响应函数?

先说下消息分类:
[标准消息]:除WM_COMMAND之外,所有以WM_开头的消息。
[命令消息]:来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。
[通告消息]:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。

1)从CWnd派生的类,都可以接收到[标准消息]、[命令消息]和[通告消息]。
2)从CCmdTarget派生的类,都可以接收到[命令消息]和[通告消息]。
3)CCmdTarget是CWnd的父类

所以也就是说,从Cwnd派生的类可以接受所有消息,但是从CCmdTarget派生的,但不是从CWnd派生的类就只能接受WM_COMMAND命令消息。
因为CDoc继承自CCmdTarget,而没有继承自CWnd的类,所以,CDoc只能处理WM_COMMAND消息。

再说下消息的传递路径。
view--->doc--->mainframe--->app
如果一个消息在CView里面没有被处理,那么我们的CDoc就可以接受到这个消息。

理论应该通了,下面我们就实践Code吧

在CTestDoc.h里面
定义一个消息及消息响应函数声明
#define WM_COMMAND_TEST1        (WM_USER + 101)
void CTestDoc::test1()

在CTestDoc.cpp里面加入以下的消息映射及消息响应函数
BEGIN_MESSAGE_MAP(CCScribDoc, CDocument)
    //{{AFX_MSG_MAP(CCScribDoc)
        // NOTE - the ClassWizard will add and remove mapping macros here.
        //    DO NOT EDIT what you see in these blocks of generated code!
    //}}AFX_MSG_MAP
    ON_COMMAND(WM_COMMAND_TEST1, test1)
END_MESSAGE_MAP()

//消息映射函数
void CTestDoc::test1()
{
        AfxMessageBox("WM_COMMAND_TEST1");
}

下面我们通过在MainFrame里面加入发送消息的函数,当然你也可以在CView里面加入发送消息函数
void CMainFrame::OnViewTest1()
{
    // TODO: Add your command handler code here
    SendMessage(WM_COMMAND, WM_COMMAND_TEST1);   

//WM_COMMAND_TEST1为WM_COMMAND消息的第一个参数
}

好了,应该说的很明白了。不懂就留言吧

当然,最好的方法是不要再doc里面响应消息。
CView就是响应消息的。然后,我们可以通过在view里面去调用CDoc里面的函数,这样是跟CDoc里面响应函数是一样的效果的。
当然这个有一个缺点就是,消息是不能带参数的,应为我们的消息响应函数是接受不到消息参数的。

抱歉!评论已关闭.