2021 NKU AI 控制系统可视化编程
第五章,对话框课上习题。我把每一步都记下来,走一下流程。
Step 1 打开 Visual Studio,创建新项目(MFC应用)
- 如果没有,则需自行下载。
- 用系统默认设置即可。
Step 2 创建对话框模板资源
- 打开资源视图(Ctrl+Shift+E,也可以在 视图 菜单栏里面找到),依次展开;
- 右键 Dialog文件夹,点击 添加资源,弹出一个对话框,点击 Dialog,点击 新建,可以看到该文件夹目录下出现 IDD_DIALOG1;
- 修改它的属性,右键这个对话框,点击 属性,修改 ID 为 IDD_MYDIALOG,当然,ID是可以随便取的,自己认得清就好了。
图片看不清。。。哈
Step 3 添加对话框类
- 右键对话框,点击 添加类,弹出对话框,按照如下修改即可。当然,类名自己定;
Step 4 添加菜单项
- 打开 资源视图,展开 Menu,双击 IDR_LiTestTYPE,
在 请在此键入框框里面键入 “操作” 两个字(当然也是自定义的),在此目录下再键入“对话框”; - 右键 “对话框”,修改它的属性(比如改 ID为 ID_OPT_DLG)
Step 5 在 CxxView类 中,响应COMMAND消息
- 打开 类向导(Ctrl+Shift+X),如图所示,双击 COMMAND,点确定即可。记得在 LiTestView.cpp添加
# include ”MyDlg.h”
;
如果现在要运行代码看一下效果,则需要在 LiTestView.cpp 的 OnOptDlg() 函数中添加CMyDlg Dlg;
和Dlg.DoModal();
,但是之后还会在这个函数里面加东西,所以先不用。
Step 6 回到对话框的界面,准备向里面加东西
- 点击 视图,工具箱,对话框编辑器,把需要的控件拖到对话框里面就好了;
- 弄成下面这样
Step 7 编辑控件
- 修改 ID,右键每一个控件,点击 属性,按照这个表格修改 ID即可;
对话框 IDD_DIALOGCOLOR
矩形单选按钮 IDC_RADIO_RECT
椭圆单选按钮 IDC_RADIO_ELIP
直线单选按钮 IDC_RADIO_LINE
x1示例编辑框 IDC_EDIT_X1
y1示例编辑框 IDC_EDIT_Y1
x2示例编辑框 IDC_EDIT_X2
y2示例编辑框 IDC_EDIT_Y2
实线单选按钮 IDC_RADIO_SOLID
虚线单选按钮 IDC_RADIO_DASH
点划线单选按钮 IDC_RADIO_DASHDOT
画笔宽度旁边的示例编辑框 IDC_EDIT_PEN_WIDTH
R旁边的示例编辑框 IDC_EDIT_PENR
G旁边的示例编辑框 IDC_EDIT_PENG
B旁边的示例编辑框 IDC_EDIT_PENB
颜色设置按钮 IDC_BUTTON_COLOR
画笔宽度静态文本 IDC_STATIC_PEN
- 重排控件顺序,ctrl+D,按照这个顺序依次 单击 控件即可
- 修改 矩形单选按钮和 实线单选按钮的控件 属性:把 group改为 true,其余不用管;
- 为控件与对话框类中的 消息处理函数建立映射,下面列举两种办法,选一种即可:
一种是直接双击控件,出现函数;
另一种是右键控件,属性,控件事件,选择需要的 消息函数即可。
在这里,我们需要响应 颜色设置按钮的 BN_CLICKED消息,实线、虚线、点划线单选按钮的 BN_CLICKED消息;
Step 8 为控件添加控制变量
- 打开 类向导,点击 添加变量
依次设置即可。别忘了,其他选项 里面可以设置最大值和最小值。
按照下表添加控制变量:
绘图形状:int型变量型成员
绘制位置:四个int型变量型成员,正数
画笔属性:int型变量型成员
画笔宽度:控件型成员/int型变量型成员,正数
画笔颜色:三个int型变量型成员,在0~255之间
- 最后添加的变量如图所示,注意:
三个 单选按钮 只需要1个控制变量(选第一个矩形和实线)就可以了;
IDC_EDIT_PEN_WIDTH 需要添加两个变量,同名,但类型不一样。
Step 9 修改CMyDlg类构造函数
- 类向导,找到这个函数,系统已经自动生成了。只需要修改值就好。
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialog(IDD_MYDIALOG, pParent)
, m_nColorB(0)
, m_nColorG(0)
, m_nColorR(0)
, m_nPosX1(20)
, m_nPosX2(300)
, m_nPosY1(20)
, m_nPosY2(300)
, m_nShape(0)
, m_nPen(0)
, m_nPenWidth(1)
{
}
Step 10 编写控件的消息处理函数
- 颜色设置按钮的 BN_CLICKED消息
也是用 类向导找,方便一些,代码来自都来自 PPT
void CMyDlg::OnBnClickedButtonColor() {
UpdateData();
COLORREF color;
CColorDialog colorDlg;
if(colorDlg.DoModal() == IDOK) {
color = colorDlg.GetColor();
m_nColorR = GetRValue(color);
m_nColorG = GetGValue(color);
m_nColorB = GetBValue(color);
UpdateData(FALSE);
}
}
- 实线、虚线、点划线单选按钮的 BN_CLICKED消息,下面的代码意思是使画笔宽度编辑框 消失;
void CMyDlg::OnBnClickedRadioSolid()
{
GetDlgItem(IDC_STATIC_PEN)->ShowWindow(SW_NORMAL);
m_editPenWidth.ShowWindow(SW_NORMAL);
}
void CMyDlg::OnBnClickedRadioDash()
{
GetDlgItem(IDC_STATIC_PEN)->ShowWindow(SW_HIDE);
m_editPenWidth.ShowWindow(SW_HIDE);
}
Step 11 创建对话框模板并显示对话框
- LiTestView.cpp类定义中 添加变量:类向导,点击 添加自定义;
- LiTestView.cpp类构造函数里面初始化变量:类向导,找到它的构造函数,点击 转到定义
CLiTestView::CLiTestView() noexcept
{
// TODO: 在此处添加构造代码
m_nShape = 0;// 绘制形状
m_nPen = 0;// 画笔类型
m_nPenWidth = 0;// 画笔宽度
m_isDraw = false;
}
- LiTestView.cpp类的 菜单响应函数(OnOptDlg()函数)里面添加
CMyDlg Dlg;
if( Dlg.DoModal() == IDOK) {
m_isDraw = true;
m_nShape = Dlg.m_nShape; // 绘制形状
m_nPen = Dlg.m_nPen; // 画笔类型
rect.left = Dlg.m_nPosX1; rect.right = Dlg.m_nPosX2;
rect.top = Dlg.m_nPosY1; rect.bottom = Dlg.m_nPosY2;
if(m_nPen == 0) // 实线画笔
m_nPenWidth = Dlg.m_nPenWidth;
else
m_nPenWidth = 1;
color = RGB(Dlg.m_nColorR,Dlg.m_nColorG,Dlg.m_nColorB);
Invalidate();
}
- LiTestView.cpp类OnDraw()函数里面添加
CPen newPen; CPen * pOldPen;
switch(m_nPen) {
case 0: newPen.CreatePen(PS_SOLID,m_nPenWidth,color); break;
case 1: newPen.CreatePen(PS_DASH,m_nPenWidth,color); break;
case 2: newPen.CreatePen(PS_DASHDOT,m_nPenWidth,color);
break;
}
pOldPen = pDC->SelectObject(&newPen);
switch(m_nShape) {
case 0:pDC->Rectangle(rect); break;
case 1:pDC->Ellipse(rect); break;
case 2: pDC->MoveTo(CPoint(rect.left,rect.top));
pDC->LineTo(CPoint(rect.right,rect.bottom)); break;
}
pDC->SelectObject(pOldPen);
OK,整完了,虽然操作流程熟悉了,但还是要知道每一步的意义啊。
个人作业,转载需注明网址。谢谢。
https://blog.csdn.net/Wolf_AgOH/article/details/118661530