MFC-控件综合应用

(1)创建一个默认的对话框应用程序,在对话框中添加一个滚动条和两个滑动条来调整对话框的背景颜色的3个分量:R(红色分量)、G(绿色分量)和B(蓝色分量),结果如图1所示。

MFC控件综合应用

图1 应用程序主界面 

(2)实现功能:在图1中,单击“课程信息”按钮,弹出“课程信息”对话框,如图2所示;单击“学生基本信息”按钮,弹出“学生基本信息”对话框,如图3所示;单击“添加”按钮,课程信息(学生基本信息)显示在列表框中。

(3)设计一个如图2所示的“课程信息”对话框。

MFC控件

图2

(4)设计一个如图3所示的“学生基本信息”对话框。

MFC控件

图 3

解答:

1、首先参看前一篇文章,熟悉对话框的建立和相互之间的调用过程:

《MFC-对话框间的互相调用及数据传递》

http://www.icoder.top/blog/index.php/2017/06/08/mfc-modal-dialog/

MFC-对话框间的互相调用及数据传递(模态对话框)

2、参看此前文章,熟悉如何通过滚动条调整背景颜色。(滑块与此几乎一样)

《MFC-滚动条控件》

http://www.icoder.top/blog/index.php/2017/06/08/mfc-cscrollbar/

MFC-滚动条控件

3、完成三个对话框的界面设计与对话框类的添加

设计课程信息对话框时需要注意:开课学期的Slider Control和Spin Control控件最好先后放置,这样他们的Tab顺序才能紧靠一起(比如11、12),才能实现两者的绑定。如果Tab顺序有问题,也没有关系,在对话框设计界面按Ctrl+D,即可调整Tab顺序

4、在主对话框的.cpp文件(…Dlg.cpp)文件中引入头文件:

#include "course.h"
#include "student.h"

以便能够调用课程信息与学生信息对话框。

5、为主对话框的控件绑定变量,如下:

MFC绑定变量

6、为课程信息对话框的控件绑定变量,如下(控件ID我没有改,所以有点乱,看后面变量名应该能知道差不多):

MFC控件变量绑定

注:为课程类型和所属专业添加CComboBox类型的变量,是为了方便添加下拉列表的数据。不过也可以直接在组合框控件的data属性中添加填充控件的数据,用分号隔开。

7、为学生信息对话框类添加自定义变量,以及为控件绑定变量。

MFC绑定变量

sex——保存性别,student_birth——保存出生日期。

以上完成了界面设计和所需变量的绑定。

下面来实现通过滑块和滚动条来调整对话框背景色,方法同上推荐文章:

1、在OnInitDialog()函数(即对话框初始化函数)中添加滚动条和滑块初始化代码:

Red.SetScrollRange(0, 255);
Green.SetRange(0, 255);
Blue.SetRange(0, 255);

Red.SetScrollPos(100);
Green.SetPos(100);
Blue.SetPos(100);

2、在类向导中为WM_VSCROLL消息添加消息响应函数响应滚动条和滑块垂直拖动消息:

void CControlEx4Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	int iRedNowPos, iGreenNowPos, iBlueNowPos; //记录滚动条的整型数

	iRedNowPos = Red.GetScrollPos();//获得滚动条当前位置
	iGreenNowPos = Green.GetPos();
	iBlueNowPos = Blue.GetPos();

	//对红色滚动条进行操作
	if (pScrollBar == &Red)
	{
		switch (nSBCode)
		{
		case SB_THUMBTRACK: //拖动滚动条
			Red.SetScrollPos(nPos); //设定滚动条位置
			iRedNowPos = nPos;
			break;
		case SB_LINERIGHT: //按向右按钮
			iRedNowPos = Red.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos + 1; //位置量+1
			if (iRedNowPos > 255) {
				iRedNowPos = 255;
			}
			break;
		case SB_LINELEFT: //按向左按钮
			iRedNowPos = Red.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos - 1; //位置量-1
			if (iRedNowPos < 0) {
				iRedNowPos = 0;
			}
			break;
		case SB_PAGERIGHT: //击向右按钮和滑动块之间的区域
			iRedNowPos = Red.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos + 10; //位置量+10
			if (iRedNowPos > 255) {
				iRedNowPos = 255;
			}
			break;
		case SB_PAGELEFT: //击向左按钮和滑动块之间的区域
			iRedNowPos = Red.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos - 10; //位置量-10
			if (iRedNowPos < 0) {
				iRedNowPos = 0;
			}
			break;
		}
	}

	//对绿色滑块进行操作
	if (pScrollBar->GetDlgCtrlID() == IDC_SLIDER2)
	{
		iGreenNowPos = Green.GetPos();
	}

	//对蓝色滑块进行操作
	if (pScrollBar->GetDlgCtrlID() == IDC_SLIDER1)
	{
		iBlueNowPos = Blue.GetPos();
	}

	//设定滚动条与滑块位置
	Red.SetScrollPos(iRedNowPos);
	Green.SetPos(iGreenNowPos);
	Blue.SetPos(iBlueNowPos);

	Invalidate(); //发送重绘消息
	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}

3、上述代码中使用Invalidate()函数发送重绘对话框消息后,会调用OnPaint()函数,在OnPaint()函数中加入重绘用户区的代码:

//重绘用户区
CDC *pDC = GetDC(); //得到设备环境指针
CBrush newBrush; //定义新画刷
newBrush.CreateSolidBrush(RGB(Red.GetScrollPos(), Green.GetPos(), Blue.GetPos()));
pDC->SelectObject(&newBrush); //选入新画刷
CRect rect;
GetClientRect(&rect);
pDC->Rectangle(rect.left, rect.top, rect.right, rect.bottom);
ReleaseDC(pDC);

至此完成背景色功能。

接下来完成课程信息录入功能:

1、首先完善课程信息对话框类:

切换到类视图,重写OnInitDialog()函数,方法如下:

VS中重写OnInitDlalog函数

OnInitDialog()函数中添加如下代码:

major.AddString(L"机械工程及其自动化");
major.AddString(L"金融工程");

course_type.AddString(L"专修");
course_type.AddString(L"通修");
course_type.AddString(L"选修");

CSpinButtonCtrl *pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);
pSpin->SetRange(0, 8);
pSpin->SetPos(3);
pSpin->GetBuddy()->SetWindowTextW(L"3");

在类向导中为WM_VSCROLL消息添加消息响应函数响应Spin Control的消息:

void course::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (pScrollBar->GetDlgCtrlID() == IDC_SPIN1)
	{
		CString strValue;
		strValue.Format(L"%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strValue);
		course_time = strValue;
	}
	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

为“添加”按钮添加事件处理程序:

void course::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
        UpdateData(TRUE);
	CDialog::OnOK();
}

2、回到主对话框窗口,为“添加课程信息”按钮添加事件处理程序:

void CControlEx4Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	course dlg;
	if (dlg.DoModal() == IDOK)
	{
		ResultDisplay = L"课程号:" + dlg.course_number + L"\r\n"
			+ L"课程名称:" + dlg.course_name + "\r\n"
			+ L"所属专业:" + dlg.course_major + L"\r\n"
			+ L"课程类型:" + dlg.type + L"\r\n"
			+ L"开课学期:" + dlg.course_time + "\r\n"
			+ L"课时数:" + dlg.class_hour + "\r\n"
			+ L"学分:" + dlg.credit;
		UpdateData(FALSE);
	}
}

至此完成添加课程信息功能。

最后完成添加学生基本信息功能:

1、完善学生基本信息对话框。

同上,重写OnInitDialog()函数,添加:

m_major.AddString(L"机械工程及其自动化");
m_major.AddString(L"金融工程");
CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);

2、为“确定”按钮添加事件处理程序:

void student::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	GetDlgItemText(GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2), sex);
	GetDlgItemText(IDC_DATETIMEPICKER1, student_birth);
	UpdateData(TRUE);
	CDialog::OnOK();
}

3、回到主对话框,为“学生基本信息”按钮添加事件处理程序:

void CControlEx4Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	student dlg;
	if (dlg.DoModal() == IDOK)
	{
		ResultDisplay = L"姓名:" + dlg.name + L"\r\n"
			+ L"学号:" + dlg.number + "\r\n"
			+ L"性别:" + dlg.sex + L"\r\n"
			+ L"出生年月:" + dlg.student_birth + L"\r\n"
			+ L"所学专业:" + dlg.student_major;
		UpdateData(FALSE);
	}
}

至此实现了要求的所有功能。

发帖时间: MFC 归档位置:

关于 “MFC-控件综合应用” 的 4 个意见

  1. 你好呀,看到这个教程觉得非常有用,这些教程的图片在哪里能够找到呢?谢谢!

评论关闭。