CMyFigureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rect; //定义一个 CRect 类的对象 (本次键入)
GetClientRect(&rect); //得到一个视图窗口的矩形边界
pDC>SetMapMode(MM_LOMETRIC); //设定映射模式 pDC>SetViewportOrg(int(rect.right/2),int(rect.bottom/2)); //设定坐标原点 MyFillRect(pDC,RGB(255,0,0),(0,0),600,400); //矩形(1)子函数 MyRectangle(pDC,300,0,0,500,RGB(100,110,120)); //矩形(2)子函数 MyEllipse(pDC,500,300,200,RGB(0,255,0)); //圆子函数 MyPolygon(pDC,350,300,RGB(0,0,255)); //五角星子函数 MyLine(pDC,600,300,600,300,4,RGB(255,0,0)); //实直线子函数 MyLine(pDC,600,300,600,300,4,RGB(0,255,0)); //实直线子函数) MyArc(pDC,100,0,800,150,200,4,RGB(0,0,0)); //圆弧线段子函数 MyArc(pDC,100,0,800,40,40,4,RGB(0,0,0)); //圆弧线段子函数 }
编译、连接后,运行该程序,结果如图 3.18 所示。
图 3.18 绘图程序运行结果
综合设计题
1.设计一个如图 3.19 所示的“显示信息”对话框程序。当单击“确定”按钮后,在右边 的编辑框中显示有关信息。
图 3.19 “显示信息”对话框
(1)首先创建一个对话框程序框架,然后放置各控件,进行属性设计,各文本编辑框和 复选框按表 3.5 连接变量,其余控件不需要连接变量。
表 3.5 与控件连接的变量
控件 标题 变量名 变量类别 变量类型
左文本编辑框 无 m_e1 Value CString
右文本编辑框 无 m_e2 Value CString
旅游 m_c1 Value BOOL
运动 m_c2 Value BOOL
复选框
音乐 m_c3 Value BOOL
(2) “确定”按钮的消息处理函数:
void CEx03Dlg::OnButton1() {
// TODO: Add your control notification handler code here UpdateData(TRUE);
CString s;
s=m_e1;
s+= " 爱好 :";
if (m_c1) s+= " 旅游 ";
if (m_c2) s+= " 运动 ";
if (m_c3) s+= " 音乐 ";
m_e2=s;
UpdateData(FALSE);
}
2.编写一个进行算术运算的计算器程序,界面如图 3.20 所示。
图 3.20 计算器界面
建立工程文件 calc_mfc,主要的控件 ID 及其对应的变量如表 3.6 所示。
表 3.6 控件及与控件连接的变量
控件 ID Caption 连接变量名称 变量类型 备注
IDC_EDIT1 m_dNum Double(Value) 编辑框
IDC_BTN_0 0 按钮
IDC_BTN_1 1 按钮
IDC_BTN_2 2 按钮
IDC_BTN_3 3 按钮
IDC_BTN_4 4 按钮
IDC_BTN_5 5 按钮
IDC_BTN_6 6 按钮
IDC_BTN_7 7 按钮
IDC_BTN_8 8 按钮
IDC_BTN_9 9 按钮
IDC_BTN_DOT . 按钮
IDC_BTN_ADD + 按钮
IDC_BTN_SUB 按钮
IDC_BTN_MUL * 按钮
IDC_BTN_DIV / 按钮
IDC_BTN_SQRT SQRT 按钮
IDC_BTN_EQUAL = 按钮
IDC_BTN_AC AC 按钮
(1)在 IDC_EDIT1 属性的样式(Style)选项卡中,将排列文本(Align text)设置为靠
右(right)。
(2)向 CCalc_mfcDlg 类添加如表 3.7 所示的成员变量。
表 3.7 新增加的成员变量
变量名称 变量类型 变量属性
m_nDotNo int public
m_nDotSign int public
m_dPre double public
m_dCur double public
m_dNext double public
m_strPre CString public m_strCur CString public m_strNext CString public
(3)在 calc_mfcDlg.cpp 的 OnInitDialog()函数中添加如下代码将变量初始化:
m_dPre=0;
m_dCur=0;
m_dNext=0;
m_strPre=_T("");
m_strCur=_T("");
m_strNext=_T("");
m_nDotSign=0;
m_nDotNo=0;
(4)通过 MFC 的“建立类向导”向 CCalc_mfcDlg 类添加各按钮的 BN_CLICKED 消息 处理函数,如表 3.8 所示。
表 3.8 各按钮对应的消息处理函数
按钮的 ID 值 消息函数名 按钮的 ID 值 消息函数名
IDC_BTN_0 OnBtn0() IDC_BTN_8 OnBtn8()
IDC_BTN_1 OnBtn1() IDC_BTN_9 OnBtn9()
IDC_BTN_2 OnBtn2() IDC_BTN_ADD OnBtnAdd() IDC_BTN_3 OnBtn3() IDC_BTN_SUB OnBtnSub() IDC_BTN_4 OnBtn4() IDC_BTN_MUL OnBtnMul() IDC_BTN_5 OnBtn5() IDC_BTN_DIV OnBtnDiv() IDC_BTN_6 OnBtn6() IDC_BTN_DOT OnBtnDot() IDC_BTN_7 OnBtn7() IDC_BTN_EQUAL OnBtnEqual()
(5)因为程序中用到了一些数学函数,所以在 calc_mfcDlg.cpp 开始处添加包含语句
#include "math.h"。
(6) 在 calc_mfcDlg.cpp 源程序文件的末尾添加公有成员函数 SetNum。 这是为了处理 0~9 这些数字按钮消息,每个消息用自己的值作为参数,调用这个成员函数,代码如下:
void CCalc_mfcDlg::SetNum(int i)
UpdateData(false); //更新与变量连接的文本编辑框的值 m_strCur=_T("");
}
在 calc_mfcDlg.h 文件的 CCalc_mfcDlg 类中添加成员函数的声明:void SetNum(int);。
OnBtn0()~OnBtn9()消息处理函数简单地调用 SetNum 函数即可,如 OnBtn0()函数的代码 如下:
(7)在 calc_mfcDlg.cpp 源程序文件的末尾添加公有成员函数 process()。
计算器程序的关键是计算的顺序,当按下运算符键(+、、*、/等)时,它的右操作数还
{
在菜单编辑器窗口中建立两个菜单项 Clear 和 About,其 ID 分别为 menu_id1 和 menu_id2,如 图 3.21 所示。
图 3.21 “菜单项目属性”对话框 为菜单定义消息处理函数,Clear 的消息处理函数代码为:
void CCalc_mfcDlg::Onid1() {
// TODO: Add your command handler code here OnBtnAc();
}
About 的消息处理函数代码为:
void CCalc_mfcDlg::Onid2() {
// TODO: Add your command handler code here CAboutDlg dlg;
dlg.DoModal();
}
②最后将菜单和对话框关联,方法是右击对话框,选择快捷菜单中的“属性” ,在“对话 属性”窗口中,选择“菜单”列表框中刚才建立的菜单 ID,如图 3.22 所示。
图 3.22 对话框属性窗口
3.建立一个单文档窗口应用程序 draw_circle,在菜单中增加一个“图形参数设置”菜单 项(如图 3.23 所示),执行该菜单项可以弹出一个对话框设置需要绘制的圆的圆心及填充颜色
(见图 3.24) 。退出对话框后可在文档窗口区绘制出相应的圆。
图 3.23 单文档窗口界面
图 3.24 “参数设置”对话框
(1)创建单文档工程文件 draw_circle,为该窗口添加菜单、对话框资源。
(2)创建对话框类。新创建的对话框应有一个类与之对应并添加到工程中,在此创建 CSetDlg 类。打开新建的对话框,选择“查看”→“建立类向导”菜单,在弹出的对话框中选 择 Creat a new class,在接下来的对话框中输入类名 CSetDlg,单击 OK 按钮。对话框中各控件 及连接变量如表 3.9 所示。
表 3.9 对话框成员及各控件属性
控件 ID 值 属性 连接变量
X,Y Edit IDC_X1,IDC_Y1 IDC_Radius
默认 m_intX1,m_intY1
m_Radius
Red Edit IDC_RED 默认 m_intRed(UINT),
m_editRed(Control)
Green Edit IDC_GREEN 默认 m_intGreen,m_editGreen
Blue Edit IDC_BLUE 默认 m_intBlue,m_editBlue
Red Spin IDC_SPIN1 选中“自动结伴”及“自动结伴整
数” ,其余默认
m_spinRed
Green Spin IDC_SPIN2 同上 m_spinGreen
Blue Spin IDC_SPIN3 同上 m_spinBlue
(3) 为 CDraw_circleView 视图类 (在 CDraw_circleView.h 文件中) 添加成员变量 (public) : int m_startx; //圆心 x 坐标
int m_starty //圆心 y 坐标 int m_radius; //记录圆半径 COLORREF m_color; //记录圆的填充颜色
(4)为“图形参数设置”菜单项添加消息处理函数 OnSet(注意在 CDraw_circleView.cpp 中添加“#include CSetDlg.h” ),其代码如下:
void CDraw_circleView::OnSet()
{ // TODO: Add your command handler code here CSetDlg dlg;
if((dlg.DoModal())==IDOK){
m_color = RGB(dlg.m_intRed, dlg.m_intGreen, dlg.m_intBlue);
m_start.x = dlg.m_intX1 ; m_start.y = dlg.m_intY1;
m_radius = dlg.m_Radius; //圆半径 }
Invalidate(); //使视图重画,调用 OnDraw()函数
}
(5)修改视图类 OnDraw()函数
void CDraw_circleView::OnDraw(CDC* pDC){
CDraw_circleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen pen(PS_SOLID,0,m_color); //构造当前颜色的画笔 CPen *oldPen;
oldPen = pDC>SelectObject(&pen); //为 CDC 选中当前画笔 CRect rect(m_start.x m_radius,m_start.y –m_radius,
m_start.x + m_radius,m_start.y + m_radius);
pDC>Ellipse(&rect);
pDC>SelectObject(oldPen);}
4.编写一个对话框程序,设计适当的界面,输入一元二次方程 ax2 +bx+ = 的系数 a、 c 0 b、c,计算并输出方程的根 x1 和 x2。
5.编写一个对话框程序完成字符串转换,转换规则为:大写字母转换成小写;小写字母 转换成大写;换行符和回车符不变;其余字符转换为“*” 。要求在一个文本框中输入一个字符 串,单击“转换”按钮,在另一个文本框中输出转换后的字符串。
6.设计一个如图 3.25 所示的“显示”对话框。当单击“确定”按钮后,用 AfxMessageBox 函数在窗口中显示相应教师的基本信息。
图 3.25 “显示”对话框界面
7.编写一个单文档的应用程序,并添加“绘图”菜单及“正弦” 、 “余弦” 、 “正切” 、 “余 切”子菜单,单击绘图子菜单时在文档窗口区绘制出相应的曲线。