MFC自定义消息与发送处理

自定义消息与发送处理

  • 以销售管理系统项目为例子

  • 消息的定义在主窗口MainFrm.h下:

    //自定义消息,MW_USER是自定义的,为了指示选中了哪个选项
    //后边的偏置是自己定的,为了避免与系统原有的重复
    #define NM_A (WM_USER + 1)
    #define NM_B (WM_USER + 2)
    #define NM_C (WM_USER + 3)
    #define NM_D (WM_USER + 4)
    #define NM_E (WM_USER + 5)
    
  • 在MainFrm.cpp下定义消息的分解宏

    //ON_MESSAGE是响应的自动以消息
    //产生NM_X消息,自动调用OnMyChange函数
    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
        ON_MESSAGE(NM_A, OnMyChange)
    	ON_MESSAGE(NM_B, OnMyChange)
    	ON_MESSAGE(NM_C, OnMyChange)
    	ON_MESSAGE(NM_D, OnMyChange)
    	ON_MESSAGE(NM_E, OnMyChange)
    END_MESSAGE_MAP()
    
  • 在分窗口SelectView.cpp中定义发送消息

    //获取当前选中项
    HTREEITEM item = m_tree->GetSelectedItem();
    //获取选中项的内容
    CString str = m_tree->GetItemText(item);
    //把选中哪个框的消息发送出去,
    if (str == TEXT("个人信息")){
    	//PostMessage 将一个消息放入窗口的消息队列,
    	//这里发送消息是跨窗口,从左侧到右侧,所以要用原生的函数,前面加两个::
    	//AfxGetMainWnd() 框架窗口对象的指针
    	//AfxGetMainWnd()->GetSafeHwnd()  获取返回窗口的句柄
    	//NM_A 发送自定义消息
    	//(LPARAM)0:指定了附加信息,此参数这里没有意义
    	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A,(LPARAM)0);
    	}
    else if (str == TEXT("销售管理"))
    	 ::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_B, (WPARAM)NM_B, (LPARAM)0); 
    else if (str == TEXT("库存信息"))
    	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_C, (WPARAM)NM_C, (LPARAM)0);
    else if (str == TEXT("库存添加"))
    	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_D, (WPARAM)NM_D, (LPARAM)0);
    else if (str == TEXT("库存删除"))
    	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_E, (WPARAM)NM_E, (LPARAM)0);
    
  • 在MainFrm.cpp下定义消息响应函数OnMyChange,。

  • 作用是根据收到的消息,显示对应的窗口。看第一个就行了,后边形式差不多

    LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam){
    	CCreateContext Context;
    	//接受消息
    	if (wParam == NM_A){
    		Context.m_pNewViewClass=RUNTIME_CLASS(CUserDlg);
    		Context.m_pCurrentFrame = this;
    		Context.m_pLastView = (CFormView*)m_splitter.GetPane(0, 1);
    		m_splitter.DeleteView(0, 1);
    		m_splitter.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context);
    		CUserDlg *pNewView = (CUserDlg*)m_splitter.GetPane(0, 1);
    		m_splitter.RecalcLayout();
    		pNewView->OnInitialUpdate();
    		m_splitter.SetActivePane(0, 1);
    	}
    	else if (wParam == NM_B)
    	{
    			Context.m_pNewViewClass = RUNTIME_CLASS(CSellDlg);
    			Context.m_pCurrentFrame = this;
    			Context.m_pLastView = (CFormView*)m_splitter.GetPane(0, 1);
    			m_splitter.DeleteView(0, 1);
    			m_splitter.CreateView(0, 1, RUNTIME_CLASS(CSellDlg), CSize(600, 500), &Context);
    			CSellDlg *pNewView = (CSellDlg*)m_splitter.GetPane(0, 1);
    			m_splitter.RecalcLayout();
    			pNewView->OnInitialUpdate();
    			m_splitter.SetActivePane(0, 1);
    	}
    	else if (wParam == NM_C)
    	{
    		Context.m_pNewViewClass = RUNTIME_CLASS(CInfoDlg);
    		Context.m_pCurrentFrame = this;
    		Context.m_pLastView = (CFormView*)m_splitter.GetPane(0, 1);
    		m_splitter.DeleteView(0, 1);
    		m_splitter.CreateView(0, 1, RUNTIME_CLASS(CInfoDlg), CSize(600, 500), &Context);
    		CInfoDlg *pNewView = (CInfoDlg*)m_splitter.GetPane(0, 1);
    		m_splitter.RecalcLayout();
    		pNewView->OnInitialUpdate();
    		m_splitter.SetActivePane(0, 1);
    	}
    	else if (wParam == NM_D)
    	{
    		Context.m_pNewViewClass = RUNTIME_CLASS(CAddDlg);
    		Context.m_pCurrentFrame = this;
    		Context.m_pLastView = (CFormView*)m_splitter.GetPane(0, 1);
    		m_splitter.DeleteView(0, 1);
    		m_splitter.CreateView(0, 1, RUNTIME_CLASS(CAddDlg), CSize(600, 500), &Context);
    		CAddDlg *pNewView = (CAddDlg*)m_splitter.GetPane(0, 1);
    		m_splitter.RecalcLayout();
    		pNewView->OnInitialUpdate();
    		m_splitter.SetActivePane(0, 1);
    	}
    	else if (wParam == NM_E)
    	{
    		MessageBox(TEXT("SASDFF"));
    	}
    	return 0;
    }
    
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值