目录

一、点击菜单按钮弹出对话框

二、用MessageBox()函数弹框

三、MFC对话框鼠标右键弹出菜单,点击菜单弹出对话框


一、点击菜单按钮弹出对话框

1、在资源视图中(.rc文件夹下)找到menu,选择需要弹框的菜单项;

2、点击菜单项,修改菜单ID,在主程序中用ON_COMMAND()将ID和函数关联,要在主程序的头文件中声明被关联函数;

例:

菜单ID和函数关联

ON_COMMAND(ID_Task,&CMFCExampleView::OnCreateTask)

声明函数

afx_msg void OnCreateTask();

3、在资源视图中(.rc文件夹下)添加Dialog,为对话框创建类(CAboutDlg);

4、在2中被关联的函数中写如下代码实现弹框

例:

void CMFCExampleView::OnCreateTask()

{
	CAboutDlg dlg;
	dlg.DoModal();
}

5、在对话框OnBnClickedOk()中写具体弹框实现内容;

注:注意头文件的包含

二、用MessageBox()函数弹框

1、包含头文件

#include<windows.h>

2、例:

// Asia-Lee modify 20170509
int result =MessageBox( TEXT("确定新建任务吗?") , TEXT("新建任务") ,MB_YESNO);
switch(result)
{
  case IDYES:
	{
		//点击YES按钮的具体实现功能
		CMFCExampleDoc* pVitaHypDoc =GetDocument();
		pVitaHypDoc->getPostDoc()->getMesh()->DeleteAllData();
		pVitaHypDoc->getPostDoc()->getResult()->clearData();
		pVitaHypDoc->getTestDoc()->getMesh()->DeleteAllData();
		pVitaHypDoc->getTestDoc()->getResult()->clearData();
		pVitaHypDoc->getGroupManager()->removeAll();
		pVitaHypDoc->m_vectorSensorLoadCaseManager.clear();
		pVitaHypDoc->FlushAllSegment();
		pVitaHypDoc->ClearCustomNotes();
		UpdateCustomNote();
		pVitaHypDoc->updateTxtNodes(NULL);
		pVitaHypDoc->updateHoopsModel();
		UpdateView();
		((CMainFrame*)AfxGetMainWnd())->m_wndClassView.FillClassView();
		((CMainFrame*)AfxGetMainWnd())->m_wndFileView.FillFileView();
		break;
	}
 case IDNO:
	break;
}

注意:

MessageBox()函数返回值是整型,参数含义百度了解!

三、MFC对话框鼠标右键弹出菜单,点击菜单弹出对话框

1、MFC对话框上点击鼠标右键,弹出菜单

(1)打开对话框,在对话框上右键选择类向导,选择消息并选择WM_RBUTTONDOWN(双击或选择添加消息处理程序)

则会在该对话框的.cpp文件中自动添加消息处理函数

// CChartDialog 消息处理程序

void CChartDialog::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CDialogEx::OnRButtonDown(nFlags, point);
}

(2)添加右键弹出菜单,并添加响应函数

实现步骤:

a、新建一个菜单资源,IDR_TOOL_MENU

b、代码实现

void CChartDialog::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CMenu menu; //定义下面要用到的cmenu对象
	menu.LoadMenu(IDR_TOOL_MENU); //装载自定义的右键菜单 
	CMenu *pPopup = menu.GetSubMenu(0); //获取第一个弹出菜单,所以第一个菜单必须有子菜单
	CPoint point1;//定义一个用于确定光标位置的位置 
	GetCursorPos(&point1);//获取当前光标的位置,以便使得菜单可以跟随光标 
	pPopup ->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point1.x,point1.y,GetParent());//在指定位置显示弹出菜单
	CDialogEx::OnRButtonDown(nFlags, point);
}

(3)在资源视图中右键单击菜单项,选择添加事件处理程序

(4)在资源视图中为菜单中的每一项建立类向导,并添加Command响应函数,然后在这个函数中加入语句。

ON_COMMAND(ID_TOOL_DEL, &CDlgTool::OnToolDel)/
void CDlgTool::OnToolDel() 
{
	AfxMessageBox("成功!"); 
}

发现问题:

在上述步骤二中,

pPopup ->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point1.x,point1.y,this);

this表示点击菜单的消息传递到本对话框,相应的改变其值也可以传递到其它对象。如GetParent(),传递到父对话框中。