本教程是基于Visual Studio 2019的VC++大作业。
市面上大部分书本教程都使用Microsoft Visual C++工具创建,VS的教程全网少之又少。
故而本教程给初学者避雷,以单文档应用为示例,使用
Visual Studio的MFC应用
完成单文档应用的创建,并在此基础上新建对话框、菜单和工具栏等资源
一、考核题目要求
学习习惯问卷调查:
- 建立一个单文档应用项目(项目名称为学生姓名拼音首字母缩写)
- 在该应用项目下,建立一个对话框进行问卷调查,并更改对话框的标题。问卷调查的内容是学习习惯,包括早晨起床时间、每天学习小时数、学习内容、睡觉时间等。
- 在对话框中要求采用单选按钮、复选按钮、编辑框、旋转按钮等进行选择。
- 在应用项目主框架的菜单上设置一个菜单调用该对话框。
- 在工具栏设置一个工具按钮,点击该工具按钮也可调用该对话框。
- 将对话框的调查结果显示出来。
二、步骤教程
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.0
的WM_INITDIALOG
消息。
再点击第四个选项“事件”,选择IDC_SPIN1
下拉框的UDN_DELTAPC
和IDOK
中的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_strHOUR和floatm_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
,否则无法更改ID
为IDM_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型的工具按钮(上图标注),并填写问卷点击确。可以看出,程序正常运行,并可以正常完成调查问卷并将结果显示出来,实验完成。