欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MFC自定义消息发送和界面挂载

程序员文章站 2022-06-11 21:02:32
...

实现窗口拆分后MFC自定义消息发送和界面挂载

有部分类的定义在MFC静态拆分窗口中:https://blog.csdn.net/u014151564/article/details/109667552

1、在 CMainFrame.h 中,添加自定义消息宏
//WM_USER 是用户自定义消息的一个起始值
//WM_USER+100是为了区分系统消息和用户消息,避免冲突
#define NM_A	(WM_USER + 100)
#define NM_B	(WM_USER + 101)
#define NM_C	(WM_USER + 102)
#define NM_D	(WM_USER + 103)
#define NM_E	(WM_USER + 104)
2、将自定义消息写到 CMainFrame.cpp 分界宏中
//ON_MESSAGE响应的是自定义消息
//产生NM_X消息,自动调用OnMyChange函数
	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)
3、在 MainFrame.h 中声明自定义消息处理函数OnMyChange()方法
//自定义消息处理函数
private:
	afx_msg LRESULT OnMyChange(WPARAM wParam, LPARAM lParam);

在MainFrame.cpp中实现OnMyChange方法

LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
{
	return 0;
}
4、在SelectView中发送自定义消息

在重写后的CSelectView::OnTvnSelchanged()方法内对接收到的参数进行判断,并使用发送消息的方法 ::PostMessage 将对应的消息发送到MainFrame.cpp 中的 CMainFrame::OnMyChange()

if (str == TEXT("个人信息"))
	{
		::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0);
	}
5、根据不同的消息参数挂载不通同界面

在MainFrame.cpp中的CMainFrame::OnMyChange()中实现挂载

LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
{
	CCreateContext   Context;
	if (wParam == NM_A) {
		//MessageBox(TEXT("个人信息界面挂载!"));
		//挂载界面(这段代码不需要自己记,用到时可以直接找)
		Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg);
		Context.m_pCurrentFrame = this;
		Context.m_pLastView = (CFormView *)m_spliter.GetPane(0, 1);
		m_spliter.DeleteView(0, 1);
		m_spliter.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context);
		CUserDlg *pNewView = (CUserDlg *)m_spliter.GetPane(0, 1);
		m_spliter.RecalcLayout();
		pNewView->OnInitialUpdate();
		m_spliter.SetActivePane(0, 1);
	}
	return 0;
}
6、编译执行

MFC自定义消息发送和界面挂载

7、有关挂载界面代码和涉及到的函数详解

1、挂载界面代码

这一部分的代码不需要记,需要用到的时候直接找就可以

//先在上下文中找到CUserDlg这个窗口类
Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg);
//进行记录
		Context.m_pCurrentFrame = this;
		//获取到第一行第二列(这里行和列是从0开始)
		Context.m_pLastView = (CFormView *)m_spliter.GetPane(0, 1);
		//删除这部分内容
		m_spliter.DeleteView(0, 1);
		//重新创建窗口
		m_spliter.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context);
		CUserDlg *pNewView = (CUserDlg *)m_spliter.GetPane(0, 1);
		//**布局
		m_spliter.RecalcLayout();
		//调用初始化代码
		pNewView->OnInitialUpdate();
		//**显示窗口
		m_spliter.SetActivePane(0, 1);

2、::PostMessage函数
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0);

	//需要包含框架类头文件#include "MainFrm.h" 
	//CWnd::PostMessage 将一个消息放入窗口的消息队列
	//AfxGetMainWnd():框架窗口对象的指针
	//AfxGetMainWnd()->GetSafeHwnd():获取返回窗口的句柄,CWnd::GetSafeHwnd
	//NM_A:发送自定义消息
	//(WPARAM)NM_A:指定了附加的消息信息
	//(LPARAM)0:指定了附加的消息信息,此参数这里没有意义
相关标签: mfc c++ 后端