使用vs2017中编写一个MFC的程序:
1. vs2017创建一个工程:
首先打开vs2017选择创建一个工程,选择vc++目录下的MFC程序:(选择如下的选项)
接下来,根据自己项目的需要,先从“资源选项”中选择设计图形化界面:
默认情况下:该项目会生成如下的文件:
其中:
xxx.cpp是程序入口,整个工程从这儿开始执行
mainfrm是框架类,控制窗口的大小等
xxxdoc是文档类,管理工程的所有数据
xxxview是视图类,管理窗口区域的**显示*
2. 对话框与控件
选择Dialog,右键选择插入Dialog,会出现一个对话款,我们现在要做的第一步便是:更改Dialog的ID和Caption(名称),一般id的命名规则为:IDD_功能名。之后我们点击此Dialog右键,创建基于此对话框的类,一般需要重新虚函数(步骤:项目→类向导→虚函数):**OnInitDialog()**用于初始化该对话框。其他的对话框函数根据需要来填写:例如时间函数:OnTimer(UINT_PTR nIDEvent)。
接下来,我们按住:clte+alt+x选择控件,将需要用到的控件拖入到对话框中,并排列好布局,接下来更改各个控件的ID和Caption,对于控件绑定相应的(值或者触发命令)
一定好选择好事件相应的触发事件并选择好相应的函数处理程序名称:
或者值(右击控件选择添加变量值):
测试:
首先将该Dialog的类所在文件的头文件包含着:xxx.cpp文件中,在xxx.cpp文件中找到InitInstance() ,并在该函数中创建该对话框的对象,并运行程序,即完成了对应的项目测试。(备注,上述的xxx代表的是项目自动生成的文件名称)。
3. 图像和绘图
绘图要注意:在xxxView.cpp中的OnDraw(CDC* pDC)中,编写图画的代码,用于在界面上显示:
案例:
绘制时钟的代码:
void CMFCApplication1View::OnDraw(CDC* pDC)
{
CMFCApplication1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1); // 加载位图
CDC MemDC;
MemDC.CreateCompatibleDC(pDC); // 创建与pDC 兼容的内存设备环境
CBitmap *pOldBmp = MemDC.SelectObject(&Bitmap); // 选入位图
CRect rc;
GetClientRect(&rc); // 取得视图客户区大小
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &MemDC, 0, 0, SRCCOPY); //显示位图
MemDC.SelectObject(pOldBmp); // 恢复原来的位图
pDC->SetBkMode(TRANSPARENT); // 设置背景模式
CFont NewFont1; // CFont声明对象
// 使用CreateFont函数创建新字体
NewFont1.CreateFont(40, 0, 0, 0, 400, true, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial");
// 将新字体选入设备环境
CFont* pOldFont = pDC->SelectObject(&NewFont1);
pDC->TextOut(20, 20, "学生管理系统"); // 输出文本
pDC->SelectObject(pOldFont); // 恢复原来的字体
NewFont1.DeleteObject(); // 释放资源
// 绘制时钟
// 设置时钟表盘大小
CRect Clock;
Clock.left = rc.right - 110;
Clock.top = rc.top + 10;
Clock.right = rc.right - 10;
Clock.bottom = rc.top + 110;
// 计算时钟的中心点
int xCenter = Clock.left + Clock.Width() / 2;
int yCenter = Clock.top + Clock.Height() / 2;
CString strDigits;
int i, x, y;
CSize size;
// 创建一个宽度为4的紫色实线笔,用于绘制时钟边框
CPen NewPen(PS_SOLID, 4, RGB(128, 0, 255));
// 将新画笔选入设备环境
CPen *pOldPen = pDC->SelectObject(&NewPen);
// 创建一个浅绿色实心画刷,用于填充时钟表盘
CBrush NewBrush;
NewBrush.CreateSolidBrush(RGB(0, 255, 192));
// 将新画刷选入设备环境
CBrush* pOldBrush = pDC->SelectObject(&NewBrush);
// 绘制表盘
pDC->Ellipse(Clock);
// 还原绘图对象并释放资源
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
NewPen.DeleteObject();
NewBrush.DeleteObject();
// 创建新字体, 用于绘制时钟数字
CFont NewFont;
NewFont.CreateFont(15, 0, 0, 0, 700, false, false, false, GB2312_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, "楷体");
// 将新字体选入设备环境
pOldFont = pDC->SelectObject(&NewFont);
// 设置文本颜色为蓝色
pDC->SetTextColor(RGB(0, 0, 255));
double radians;
// 绘制时钟数字1-12
for (i = 1; i <= 12; i++)
{
strDigits.Format("%d", i);
//取得文本尺寸
size = pDC->GetTextExtent(strDigits, strDigits.GetLength());
// 计算数字输出位置
radians = i * 6.28 / 12;
x = xCenter - (size.cx / 2) + (int)(sin(radians)*(Clock.Width() / 2 - 10));
y = yCenter - (size.cy / 2) - (int)(cos(radians)*(Clock.Height() / 2 - 10));
// 输出数字
pDC->TextOut(x, y, strDigits);
}
// 取得系统当前时间
CTime time = CTime::GetCurrentTime();
// 开始绘制时针
radians = time.GetHour() + time.GetMinute() / 60.0 + time.GetSecond() / 3600.0;
radians *= 6.28 / 12;
// 创建宽度为5的黑色实心笔,用于绘制时针
NewPen.CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
pOldPen = pDC->SelectObject(&NewPen);
pDC->MoveTo(xCenter, yCenter);
pDC->LineTo(xCenter + (int)(sin(radians)*(Clock.Width() / 6)),
yCenter - (int)(cos(radians)*(Clock.Height() / 6)));
// 还原画笔并释放资源
pDC->SelectObject(pOldPen);
NewPen.DeleteObject();
// 开始绘制分针
radians = time.GetMinute() + time.GetSecond() / 60.0;
radians *= 6.28 / 60;
// 创建宽度为4的黑色实心笔,用于绘制分针
NewPen.CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
pOldPen = pDC->SelectObject(&NewPen);
pDC->MoveTo(xCenter, yCenter);
pDC->LineTo(xCenter + (int)(sin(radians)*(Clock.Width() / 3)),
yCenter - (int)(cos(radians)*(Clock.Height() / 3)));
// 还原画笔并释放资源
pDC->SelectObject(pOldPen);
NewPen.DeleteObject();
// 开始绘制秒针
radians = time.GetSecond();
radians *= 6.28 / 60;
// 创建宽度为2的红色实心笔,用于绘制秒针
NewPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
pOldPen = pDC->SelectObject(&NewPen);
pDC->MoveTo(xCenter, yCenter);
pDC->LineTo(xCenter + (int)(sin(radians)*(Clock.Width() * 2 / 5)),
yCenter - (int)(cos(radians)*(Clock.Height() * 2 / 5)));
// 还原画笔并释放资源
pDC->SelectObject(pOldPen);
NewPen.DeleteObject();
// 还原字体并释放资源
pDC->SelectObject(pOldFont);
NewFont.DeleteObject();
ReleaseDC(pDC); // 释放设备环境
SetTimer(1, 1000, NULL);
}
4. 菜单、工具栏和状态栏
本部分比较简单和对话框差不多,要注意菜单的Popup要选择false不然无法修改id,然后选择绑定(程序事件处理函数(属于xxxView.cpp类),并在该函数中书写相应的操作,或者创建新的对象)
5 数据库编程与应用
增删改查:下次在写:
6.大作业:学生管理系统应用指南
https://download.csdn.net/my/uploads