原创 主框架与对话框之间消息传递

2008-4-11 09:18 4091 8 9 分类: 软件与OS

总结:
消息传递的方法一:使用ON_MESSAGE
使用ON_MESSAGE响应消息,必须配合定义消息#define WM_MY_MESSAGE (WM_USER+100)


对于发送消息者-MyMessageDlg,
在其MyMessageDlg.h中,定义#define WM_MY_MESSAGE (WM_USER+100)
在其MyMessageDlg.cpp中要先添加:#include "MainFrm.h"
因为使用了CMainFrame*定义对象。
并且要有测试消息的函数:
void MyMessageDlg::OnButtonMsg()
{
    // TODO: Add your control notification handler code here
    CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd;  //先通过获取当前框架指针
    CView * active = pMF->GetActiveView();//才能获取当前视类指针
    if(active != NULL)  //获取了当前视类指针才能发送消息
    active->PostMessage(WM_MY_MESSAGE,0,0);   //使用PostMessage发送消息
}


对于消息的接受者-MessageTestView,
在其MessageTestView.h中,也要定义#define WM_MY_MESSAGE (WM_USER+100)
并定义消息映射函数-OnMyMessage()
protected:
 //{{AFX_MSG(CMessageTestView)
 afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
在其MessageTestView.cpp中,
先要声明响应消息:
BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)
 //{{AFX_MSG_MAP(CMessageTestView)
 ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
 //}}AFX_MSG_MAP
再添加消息响应的函数实现:
LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
 MessageBox("OnMyMessage!");
 return 0;
}



消息传递的方法二:使用ON_REGISTERED_MESSAGE
使用ON_REGISTERED_MESSAGE注册消息,必须配合
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");


对于消息的发送者-MyMessageDlg,
在其MyMessageDlg.h中,只要
定义static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
就可以了。
在其MyMessageDlg.cpp中要先添加:#include "MainFrm.h"
因为使用了CMainFrame*定义对象。
并且要有测试消息的函数:
void MyMessageDlg::OnButtonMsg()
{
    // TODO: Add your control notification handler code here
    CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd;  //先通过获取当前框架指针
    CView * active = pMF->GetActiveView();//才能获取当前视类指针
    if(active != NULL)  //获取了当前视类指针才能发送消息
    active->PostMessage(WM_MY_MESSAGE,0,0);   //使用PostMessage发送消息
}


对于消息的接收者-MessageTestView,
在其MessageTestView.h中不要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
应该把这个定义放到MessageTestView.cpp中,要不会出现: redefinition
在其MessageTestView.h中只要定义消息映射函数
protected:
 //{{AFX_MSG(CMessageTestView)
 afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
在其MessageTestView.cpp中,先定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
接着注册消息:
BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)
 //{{AFX_MSG_MAP(CMessageTestView)
        ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage)
 //}}AFX_MSG_MAP
最后添加消息响应的函数实现:
LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
 MessageBox("OnMyMessage!");
 return 0;
}
----------------------------------------------------------------
比较两种方法,只是略有不同。但也要小心谨慎,以免出现接收不到消息的情况。


-------------------------------------------------------------------


其他注意事项:


发送消息的-MyMessageDlg.cpp前也要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");


接受消息的-MessageTestView.cpp前也要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");


RegisterWindowMessage("Message")中""的内容是什么不重要,写什么都可以,单必须
发送者与接受者是一样的内容,例如:"Message"



 


 


从主框架向对话框如何发送消息 


CString   str;  
  str="myDlg";//对话框标题  
  CWnd   *pWnd=CWnd::FindWindow(NULL,str);  
  if(pWnd)   {  
        pWnd->SendMessage(IDR_MYMESSAGE,0,0);   }就可以了。  

文章评论1条评论)

登录后参与讨论

用户420769 2012-6-14 10:21

#include "MainFrm.h" 基于单文档的。。。最近在纠结基于对话框的消息传递,消息传递有点凌乱,正在悲剧中
相关推荐阅读
用户815303 2013-04-09 23:47
C和C++混合编程
  C和C++混合编程 extern "C"表示编译生成的内部符号名使用C约定。C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例...
用户815303 2013-03-02 22:07
IDT高精度计量芯片IDT90E32AS
  1、 完全符合IEC62052-11,IEC62053-22和IEC62053-23,ANSI c12 1和ANSI c12 20 2、5000:1动态范围内,有功能量精度为±0.1%...
用户815303 2013-03-02 21:58
IDT90E32AS
1、 完全符合IEC62052-11,IEC62053-22和IEC62053-23,ANSI c12 1和ANSI c12 20 2、5000:1动态范围内,有功能量精度为±0.1%,无功能...
用户815303 2012-12-15 21:37
DLMS IEC标准
  第61部分:对象标识系统 第62部分:接口类 第53部分:COSEM应用层 第46部分:使用HDLC(High Level Data Link Control)协议的数据链路层...
用户815303 2012-11-11 22:55
IDT 高精度宽量程计量芯片
计量功能 1、完全符合要求IEC62052 - 11,IEC62053 - 22和IEC62053 - 23,ANSI C12.1和 ANSI C12.20;适用于0.5S级或1级多相电度表要...
用户815303 2012-11-11 22:55
IDT 90E36 参数计算
为供大家调试方便 做一个参数计算工具。 ...
我要评论
1
8
关闭 站长推荐上一条 /2 下一条