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、编译执行
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:指定了附加的消息信息,此参数这里没有意义