使用VS的MFC应用创建单文档应用并添加对话框菜单和工具栏

本教程是基于Visual Studio 2019的VC++大作业。
市面上大部分书本教程都使用Microsoft Visual C++工具创建,VS的教程全网少之又少。
故而本教程给初学者避雷,以单文档应用为示例,使用
Visual Studio的MFC应用
完成单文档应用的创建,并在此基础上新建对话框、菜单和工具栏等资源

基于MFC应用的Visual Studio教程

一、考核题目要求

学习习惯问卷调查:

  • 建立一个单文档应用项目(项目名称为学生姓名拼音首字母缩写)
  • 在该应用项目下,建立一个对话框进行问卷调查,并更改对话框的标题。问卷调查的内容是学习习惯,包括早晨起床时间、每天学习小时数、学习内容、睡觉时间等。
  • 在对话框中要求采用单选按钮、复选按钮、编辑框、旋转按钮等进行选择。
  • 在应用项目主框架的菜单上设置一个菜单调用该对话框。
  • 在工具栏设置一个工具按钮,点击该工具按钮也可调用该对话框。
  • 将对话框的调查结果显示出来。

二、步骤教程

1、建立一个单文档应用项目,名称为LDS,应用程序类型为单个文档,项目样式为MFC standard,其他选项默认即可,点击完成。

在这里插入图片描述

2、新建一个对话框作为问卷调查,在资源视图中右键点击Dialog,选择插入Dialog,生成的对话框如图所示。

在这里插入图片描述
在这里插入图片描述

单击对话框,在属性框中将对话框的ID改成IDD_LDS,描述文字改成“学习习惯问卷调查”,此时对话框的左上角标题变成“学习习惯问卷调查”

3、打开工具箱中的对话框编辑器,将所需控件拖入到对话框中,在控件的属性栏里更改描述文字,同时按住shift选中多个控件,使用上方布局工具进行等间距排布,最终界面如图所示。

在这里插入图片描述

若想提前查看对话框的显示状态,可以选择格式->创建对话框,快捷键是ctrl+T
其中,注意将旋转控件属性中的自动合作者的False改成True,表示旋转控件和编辑框组合成一个多部件控件来共同显示和控制某一个值。

在这里插入图片描述

且按下ctrl+D 后的TAB键顺序,旋转控件和编辑框必须相邻,如图所示

在这里插入图片描述

4、添加对话框类,在此,我不使用类向导。在对话框旁的空白区域右键,点击添加类,此时弹出的是添加MFC类,注意一定要添加MFC类才行,并将基类选为Cdialog,类名取做CLDSDlg,遵循VC++的命名格式:类名以C开始,即Class,如图所示,点击确定。

在这里插入图片描述

5、在类视图中打开单击刚刚创建的CLDSDlg类,并打开左侧的属性框,点击上方的第六个选项“重写”,找到OnInitDialog函数,<Add>OnInitDialog()即可。

在这里插入图片描述

注意,许多人找不到对话框的WM_INITDIALOG消息映射,是因为VS2003开始已经将WM_INITDIALOG移到了重写里面,重写里面有一个OnInitDialog,对应了VC6.0WM_INITDIALOG消息。
再点击第四个选项“事件”,选择IDC_SPIN1下拉框的UDN_DELTAPCIDOK中的BN_CLICKED,均点击<Add>,即创建了控件对应事件的映射函数。

在这里插入图片描述

6、在解决方案资源管理器的LDS.cpp文件中定义如下变量CSpinButtonCtrl m_spinT,添加代码

CSpinButtonCtrl m_spinT;

在这里插入图片描述在这里插入图片描述


BOOL CAboutDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化

	CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO2);
	//给一组单选按钮中的一个指定按钮加上选中标志,并且清除组中其他按钮的选中标志
	m_spinT.SetRange(0, 24);
	//设置m_spinT的范围,即0到24
	CButton* pBtn = (CButton*)GetDlgItem(IDC_CHECK1);
	//函数检索指定的对话框中的控件句柄

	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

并在LDS.h文件中声明全局变量extern CSpinButtonCtrl m_spinT,如图所示

extern CSpinButtonCtrl m_spinT;

在这里插入图片描述

7、在CLDSDlg.h文件中声明如下两个变量:CString m_strHOURfloatm_strTIME;

CString m_strHOUR;
float m_strTIME = 0.0f;

在这里插入图片描述

并在CLDSDlg.cpp文件中添加如下代码

void CLDSDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_SPIN1, m_spinT);
	DDX_Text(pDX, IDC_EDIT1, m_strTIME);
}
void CLDSDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(TRUE);
	m_strTIME -= (float)pNMUpDown->iDelta * 0.5f;
	//每点击一下旋转按钮后,编辑框数值+/-0.5
	if (m_strTIME < 0.0)m_strTIME = 0.0f;
	if (m_strTIME > 24.0)m_strTIME = 24.0f;
	UpdateData(FALSE);
	//将变量的值,输出到与其关联的EditBox中

	*pResult = 0;
}
void CLDSDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str, strCtrl;
	//获取第一个问题的用户选择
	str = "早晨起床时间:";
	UINT nID = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);
	GetDlgItemText(nID, strCtrl);
	str = str + strCtrl;
	//获取第二个问题的用户选择
	str = str + (CString)"\n学习内容:";
	UINT nCheckIDs[4]
		= { IDC_CHECK1,IDC_CHECK2,IDC_CHECK3,IDC_CHECK4 };
	CButton* pBtn;
	for (int i = 0; i < 4; i++)
	{
		pBtn = (CButton*)GetDlgItem(nCheckIDs[i]);
		if (pBtn->GetCheck())
		{
			pBtn->GetWindowText(strCtrl);
			str = str + strCtrl;
			str = str + (CString)",";
		}
	}
	//获取第三个问题的用户选择
	str = str + (CString)"\n每天学习时间:";
	GetDlgItem(IDC_EDIT1)->GetWindowText(strCtrl);
	str = str + strCtrl + (CString)"小时";
	//获取第四个问题的用户选择
	str = str + (CString)"\n睡觉时间:";
	GetDlgItem(IDC_EDIT2)->GetWindowText(strCtrl);
	str = str + strCtrl + (CString)"小时";
	MessageBox(str);

	CDialog::OnOK();
}

8、打开资源视图中的菜单资源,双击IDR_MAINFRAME,将新建菜单命名为调查问卷,并在属性框中将弹出菜单改为False,否则无法更改IDIDM_LDS

在这里插入图片描述

9、在类视图里面单击CLDSView,在属性栏里选择第四个选项“事件”,点击刚刚更改的IDIDM_LDS,点击下方的COMMAND<Add>添加

在这里插入图片描述

生成的函数在LDSView.cpp文件中,添加如下代码,注意先在此文件中添加#include "CLDSDlg.h"文件,否则CLDSDlg类没有定义。

void CLDSView::OnLds()
{
	// TODO: 在此添加命令处理程序代码
	CLDSDlg dlg;
	dlg.DoModal();
}

10、在资源视图中选择Toolbar的工具栏,点击最右边的工具按钮,可以选择右上方的铅笔绘制个性化图案,更改这个工具按钮的ID为ID_LDSDy,如图所示。

在这里插入图片描述

11、VS里面在类视图的CmainFrame的属性框的消息中无法找到刚刚更改的工具按钮ID

在这里插入图片描述

只能通过代码来设置消息映射,对此,可以在LDS.h文件中添加afx_msg void OnLDSDy(),如图所示

afx_msg void OnLDSDy();

在这里插入图片描述

LDS.cpp文件中添加消息映射

CSpinButtonCtrl m_spinT;
// CLDSApp
BEGIN_MESSAGE_MAP(CLDSApp, CWinApp)
	ON_COMMAND(ID_APP_ABOUT, &CLDSApp::OnAppAbout)
	ON_COMMAND(ID_LDSDy, &CLDSApp::OnLDSDy)
	// 基于文件的标准文档命令
	ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
	// 标准打印设置命令
	ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

在这里插入图片描述

void CLDSApp::OnLDSDy()
{
	CLDSDlg aboutDlg;
	aboutDlg.DoModal();
}
// CLDSApp 消息处理程序

在这里插入图片描述

三、运行结果

点击问卷调查或L型的工具按钮(上图标注),并填写问卷点击确。可以看出,程序正常运行,并可以正常完成调查问卷并将结果显示出来,实验完成。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做梦咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值