自定义消息与发送处理
-
以销售管理系统项目为例子
-
消息的定义在主窗口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; }