MFC 时钟 计算器 日期天数计算
Windows大作业报告
课程名称:windows程序设计
所属学院:计算机学院
所属班级:软件113班
原 创 :刘东彦
指导老师:陆筱霞
完成日期:2012年12月3日
Windows大作业报告
7. 编写CMyDialog1::OnButton2() 消息处理函数:17
8. 编写CMyDialog1::OnButton3() 消息处理函数:17
9. 编写CMyDialog1::OnButton4() 消息处理函数:17
10. 编写CMyDialog1::OnButton5() 消息处理函数:18
11. 编写CMyDialog1::OnButton6() 消息处理函数:18
12. 编写CMyDialog1::OnButton7() 消息处理函数:18
13. 编写CMyDialog1::OnCancel()消息处理函数:19
14. 编写CMyDialog1::OnOK()消息处理函数:19
15. 编写CMyDialog1::OnPaint() 消息处理函数:19
16. 编写CMyDialog1::OnTimer() 消息处理函数:24
17. 编写CMyDialog1::OnInitDialog() 消息处理函数:24
18. 编写CMyDialog1::OnRadio1() 消息处理函数:25
19. 编写CMyDialog1::OnRadio2() 消息处理函数:25
20. 编写CMyDialog1::OnButton1() 消息处理函数25
7.编写CDialog2::OnButton1()的处理函数33
8.编写CDialog2::OnButton0()的处理函数33
9.编写CDialog2::OnButton10x()的处理函数34
10.编写CDialog2::OnButton2()的处理函数34
11.编写CDialog2::OnButton3()的处理函数35
12.编写CDialog2::OnButton3x()的处理函数35
13.编写CDialog2::OnButton4()的处理函数36
14.编写CDialog2::OnButton5()的处理函数36
15.编写CDialog2::OnButton6()的处理函数37
16.编写CDialog2::OnButton7()的处理函数37
17.编写CDialog2::OnButton8()的处理函数38
18.编写CDialog2::OnButton9()的处理函数38
19.编写CDialog2::OnButtonAcos()的处理函数38
21.编写CDialog2::OnButtonAdd()的处理函数39
22.编写CDialog2::OnButtonAsin()的处理函数40
23.编写CDialog2::OnButtonAtan()的处理函数41
24.编写CDialog2::OnButtonC()的处理函数41
25.编写CDialog2::OnButtonCe()的处理函数41
26.编写CDialog2::OnButtonCos()的处理函数42
27.编写CDialog2::OnButtonCosh()的处理函数43
28.编写CDialog2::OnButtonDe()的处理函数43
29.编写CDialog2::OnButtonDiv()的处理函数44
30.编写CDialog2::OnButtonEq()的处理函数44
31.编写CDialog2::OnButtonExq()的处理函数46
32.编写CDialog2::OnButtonInt()的处理函数46
33.编写CDialog2::OnButtonLn()的处理函数47
34.编写CDialog2::OnButtonLog()的处理函数48
35.编写CDialog2::OnButtonM1()的处理函数48
36.编写CDialog2::OnButtonM2()的处理函数49
37.编写CDialog2::OnButtonMc()的处理函数49
38.编写CDialog2::OnButtonMod()的处理函数50
39.编写CDialog2::OnButtonMr()的处理函数50
40.编写CDialog2::OnButtonMs()的处理函数51
41.编写CDialog2::OnButtonM1()的处理函数51
42.编写CDialog2::OnButtonN()的处理函数52
43.编写CDialog2::OnButtonPer()的处理函数52
44.编写CDialog2::OnButtonPi()的处理函数53
45.编写CDialog2::OnButtonRe()的处理函数53
46.编写CDialog2::OnButtonSin()的处理函数54
47.编写CDialog2::OnButtonSinh()的处理函数55
48.编写CDialog2::OnButtonSqroot()的处理函数55
49.编写CDialog2::OnButtonSu()的处理函数56
50.编写CDialog2::OnButtonTan()的处理函数56
51.编写CDialog2::OnButtonTanh()的处理函数57
52.编写CDialog2::OnButtonX2()的处理函数58
53.编写CDialog2::OnButtonX3()的处理函数58
54.编写CDialog2::OnButtonXy()的处理函数59
55.编写CDialog2::OnButtonYx()的处理函数59
56.编写CDialog2::OnButtond()的处理函数60
57.编写CDialog2::OnInitDialog()的处理函数60
58.编写CDialog2::OnButtonFa()的处理函数61
59.编写CDialog2::OnRadio3()的处理函数61
60.编写CDialog2::OnRadio4()的处理函数62
61.编写CDialog2::OnRadio5()的处理函数62
62.编写CDialog2::OnCtlColor()的处理函数62
63.编写CDialog2::OnCancel() 的处理函数62
64.编写CDialog2::OnCancel() 的处理函数63
6. 编写CDialog3::OnButtonCacl1()消息处理函数:67
7. 编写CDialog3::OnButtonCacl2()消息处理函数:71
8. 编写CDialog3::OnRadio1()消息处理函数:73
9. 编写CDialog3::OnRadio2()消息处理函数:73
10. 编写CDialog3::OnInitDialog() 消息处理函数:73
11. 编写CDialog3::OnCancel() 消息处理函数:73
12. 编写CDialog3::OnButton2() 消息处理函数:74
4. 编写CDialog4:::OnCancel() 消息处理函数:76
2.设计IDD_CWINDOWSDAZUOYE_DIALOG对话框76
4. 编写CCWindowsDazuoyeDlg::OnButton1() 消息处理函数:78
5. 编写CCWindowsDazuoyeDlg::OnButtonCacl() 消息处理函数:78
6. 编写CCWindowsDazuoyeDlg::OnButton2() 消息处理函数:78
7. 编写CCWindowsDazuoyeDlg::OnButton3() 消息处理函数:78
所属学院:计算机学院
所属专业:软件工程
所属班级:软件113班
指导老师:陆筱霞
课程名称:windows程序设计
所属小组:软件113班第二组
原创作者:刘东彦
**************************************************
在Visual C++ 6.0中,选择“文件”→“新建”(或者使用快捷键“ctrl+N”→“工程”→选定“MFC AppWizard(.exe)”,输入工程名(名字可以为任意名字,比如我们的工程名称为“CWindowsDazuoye”)(如图 1所示)(也可以更改储存位置,比如我们的程序储存在“E:\编译\windows程序设计”,也可以使用默认),点确定→选定基本对话框(如图 2所示),然后点完成.
图 1
图 2
把需要用的图片(如zxgxy.bmp(如图 3所示)和出错提示.bmp(如图 4所示))放到新建工程产生的res文件中,需要的图片如图 5所示
图 3 zxgxy.bmp 图 4 出错提示.bmp
图 3.1.2
图 5
按“Ctrl+R”(或者选择“插入”(如图 6所示)→“资源”),在弹出对话框选择“Bitmap”(或者切换到ResourceView页面,选定工程名(如图 7所示)并右击,在弹出菜单中选定“插入”在弹出对话框中选择“Bitmap”),(如图 8所示)选择引入,浏览图片,找到图片所在位置,其中在“文件类型”下拉框中选定“All Flies(*.*)”,否则无法插入一些图片,并分别按顺序添加图片“zxgxy.bmp.bmp”(如图9所示)和“出错提示.bmp”,ID分别默认名为IDB_BITMAP1,IDB_BITMAP2(可以修改ID名称,也可以使用默认,我们的程序使用的默认ID名)
图 6
图 7
图 8
图 9
按“Ctrl+R”(或者选择(或者选择“插入”(参照图 6所示)→“资源”),在弹出对话框(参照图 8所示)选择双击“Dialog”(或者切换到ResourceView页面,展开所有资源节点,单击Dialog(如图 10所示),在弹出对话框中选择“插入 Dialog”)。
并右击对话框修改其标题为“windows程序设计第二组—-钟表和电子钟显示”,如图 11所示
图 10
图 11
并按要求和表1、图 12所示内容,向对话框模板中加入控件(添加控件后,选定右击,在弹出的菜单中选择“属性”,其中第一个静态文本如图13所示和第二个静态文本如图 14所示的对话框,然后在第二个文本中可选择样式,并修改如图 15所示,其它控件可按照以上操作进行添加,需注意的是修改控件ID为“IDC_COMBO1”在数据中的输入列表项目中输入数据时,按住“ctrl+Enter”组合键换行,并不是按住“Enter”键换行,效果如图 16所示)
图 12
表 1 控件属性
控件类型 |
ID |
标题 |
其他属性 |
静态文本 |
默认 |
电子钟显示: |
默认 |
静态文本 |
IDC_STATIC_CLOCK |
电子钟 |
在样式中的排列文本下拉框中选定居中,并选中垂直居中,凹陷和边框 |
静态文本 |
IDC_STATIC_TITLE |
|
在样式中的排列文本下拉框中选定居中,并选中垂直居中,凹陷和边框属性 |
分组框 |
默认 |
时区选择 |
默认 |
组合框 |
IDC_COMBO1 |
|
在样式中的类型本下拉框中选定简单,并去掉分类属性,在数据中的输入列表项目中输入“ 西十二区 西十一区 … 零时区 … 东十二区” |
分组框 |
默认 |
电子钟显示格式 |
默认 |
单选按钮 |
IDC_RADIO1 |
24时 |
默认 |
单选按钮 |
IDC_RADIO2 |
12时 |
默认 |
分组框 |
默认 |
改变颜色 |
默认 |
命令按钮 |
IDC_BUTTON2 |
对话框背景颜色 |
默认 |
命令按钮 |
IDC_BUTTON3 |
时针颜色 |
默认 |
命令按钮 |
IDC_BUTTON4 |
分针颜色 |
默认 |
命令按钮 |
IDC_BUTTON5 |
秒针颜色 |
默认 |
命令按钮 |
IDC_BUTTON6 |
电子钟背景颜色 |
默认 |
命令按钮 |
IDC_BUTTON7 |
电子钟字体颜色 |
默认 |
命令按钮 |
IDC_BUTTON1 |
作者信息 |
默认 |
命令按钮 |
IDCANCEL |
返回主目录 |
默认 |
命令按钮 |
IDOK |
结束程序 |
默认 |
图 13
图 14
图 15
图16
单击对话框,按“Ctrl+W”(或者右击,在弹出的对话框中选择“建立类向导”或者选择“查看”→“建立类向导”),在弹出的对话框(如图 17所示),选择“OK”按钮,然后建立一个新类“CMyDialog1”(可以为任意名)(如图 18所示),在弹出对话框中选择Member Variables,并按表 3.1.2所示关联变量
图 17
图 18
表 2 CMyDialog1类的控件关联变量
控件ID |
变量类型 |
变量名 |
IDC_COMBO1 |
CComboBox |
m_listBox |
切换到类视图页面,在“CMyDialog1”单击(如图 19所示),选择“Add Member Variables”,并按表 3所示添加类CMyDialog1成员变量
图 19
表 3 CMyDialog1类成员变量
变量类型 |
变量名称 |
访问权限 |
BOOL |
m_pBool |
Protected |
或者项目切换到工作区间,选择头文件中“CMyDialog1.h”,在下列位置添加如下代码(红色为新加代码):
…
//}}AFX_VIRTUAL
BOOL m_pBool;
// Generated message map functions
…
项目切换到工作区间,选择头文件中“CMyDialog1.h”,在下列位置添加如下代码(红色为新加代码):
…
//}}AFX_VIRTUAL
protected:
static int m_DBkColor,m_HourColor,m_MinuteColor,
m_SecondColor,m_BkFontColor,m_FontColor;
BOOL m_pBool;
// Generated message map functions
…
项目切换到工作区间,选择头文件中“CMyDialog1.cpp”,在下列位置添加如下代码(红色为新加代码)初始化静态成员变量:
…
/////////////////////////////////////////////////////////////////////////////
// CMyDialog1 dialog
//初始化所有的颜色
int CMyDialog1::m_DBkColor=int(RGB(255,100,100)),CMyDialog1::m_HourColor=int(RGB(0,0,255)),CMyDialog1::m_MinuteColor=int(RGB(0,255,0)),
CMyDialog1::m_SecondColor=int(RGB(200,0,0)),CMyDialog1::m_BkFontColor=int(RGB(255,255,255)),CMyDialog1::m_FontColor=int(RGB(255,0,0));
CMyDialog1::CMyDialog1(CWnd* pParent /*=NULL*/)
: CDialog(CMyDialog1::IDD, pParent)
…
在类向导中按要求和表 4 CMyDialog1的控件通知消息处理函数添加消息处理函数(如图 20-1所示)
图 20-1
表 4 CMyDialog1的控件通知消息处理函数
控件ID |
消息 |
消息处理函数 |
IDC_BUTTON2 |
BN_CLICKED |
默认 |
IDC_BUTTON3 |
BN_CLICKED |
默认 |
IDC_BUTTON4 |
BN_CLICKED |
默认 |
IDC_BUTTON5 |
BN_CLICKED |
默认 |
IDC_BUTTON6 |
BN_CLICKED |
默认 |
IDC_BUTTON7 |
BN_CLICKED |
默认 |
IDC_BUTTON1 |
BN_CLICKED |
默认 |
IDCANCEL |
BN_CLICKED |
默认 |
IDOK |
BN_CLICKED |
默认 |
IDC_RADIO1 |
BN_CLICKED |
默认 |
IDC_RADIO2 |
BN_CLICKED |
默认 |
CMyDialog1 |
WM_INITDIALOG |
默认 |
CMyDialog1 |
WM_PAINT |
默认 |
CMyDialog1 |
WM_CTLCOLOR |
默认 |
CMyDialog1 |
WM_TIMER |
默认 |
void CMyDialog1::OnButton2()
{
// TODO: Add your control notification handler code here
CColorDialog dlg;
int nRect=dlg.DoModal();
if(nRect==IDOK)
{
m_DBkColor=dlg.GetColor();
}
}
void CMyDialog1::OnButton3()
{
// TODO: Add your control notification handler code here
CColorDialog dlg;
int nRect=dlg.DoModal();
if(nRect==IDOK)
{
m_HourColor=dlg.GetColor();
}
}
void CMyDialog1::OnButton4()
{
// TODO: Add your control notification handler code here
CColorDialog dlg;
int nRect=dlg.DoModal();
if(nRect==IDOK)
{
m_MinuteColor=dlg.GetColor();
}
}
void CMyDialog1::OnButton5()
{
// TODO: Add your control notification handler code here
CColorDialog dlg;
int nRect=dlg.DoModal();
if(nRect==IDOK)
{
m_SecondColor=dlg.GetColor();
}
}
void CMyDialog1::OnButton6()
{
// TODO: Add your control notification handler code here
CColorDialog dlg;
int nRect=dlg.DoModal();
if(nRect==IDOK)
{
m_BkFontColor=dlg.GetColor();
}
}
void CMyDialog1::OnButton7()
{
// TODO: Add your control notification handler code here
CColorDialog dlg;
int nRect=dlg.DoModal();
if(nRect==IDOK)
{
m_FontColor=dlg.GetColor();
}
}
void CMyDialog1::OnCancel()
{
// TODO: Add extra cleanup here
KillTimer(1);//移除定时器
CDialog::OnCancel();
CCWindowsDazuoyeDlg dlg;
dlg.DoModal();
}
void CMyDialog1::OnOK()
{
// TODO: Add extra validation here
KillTimer(1);//移除定时器
exit(0);//结束程序
CDialog::OnOK();
}
void CMyDialog1::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC *pDC = GetDC();
CBitmap bmp;// 内存中存在临时图像的位图
CRect rect;
GetClientRect(&rect); //获取客户区大小
CDC dcMem; // 用于缓冲作图的内存
dcMem.CreateCompatibleDC(pDC);// 依附窗口DC创建兼容DC
bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
dcMem.SelectObject(&bmp);// 将位图选入内存
dcMem.FillSolidRect(rect,m_DBkColor);// 按照原有背景色(或自己设置的背景色)填充客户区
dcMem.SelectObject(&bmp);// 将位图选入内存DC
// 绘图操作
static const double pi=3.141592635; //得到客户区的矩形
GetClientRect(&rect); //得到表盘中央位置,即圆心
int x0=rect.Width()/2; //得到对话框的宽
int y0=rect.Height()/2;//得到对话框的高
int r=(x0>y0?y0:x0);//得到半径(以宽和高的最小值为半径)
x0=r+55; //绘钟表图像距左边位置为55像素
CPen Pen1;
Pen1.CreatePen(PS_SOLID,1,RGB(255,100,0));//设置椭圆的颜色
dcMem.SelectObject(&Pen1);
dcMem.Ellipse(CRect(x0-r,y0-r,x0+r,y0+r)); //画最外侧的椭圆
dcMem.Ellipse(CRect(x0-r+6,y0-r+6,x0+r-6,y0+r-6)); //画外侧的椭圆
dcMem.Ellipse(CRect(x0-r+35,y0-r+35,x0+r-35,y0+r-35)); //画最内侧的椭圆
CPen Pen2(PS_SOLID,3,RGB(0,0,255));//设置圆点的颜色
dcMem.SelectObject(Pen2); //设置椭圆的颜色
double rate = (double)(2.0* pi/60.0); //分钟或秒针每分/秒走过角度大小 ,每刻度转过角度大小
double halfPi=pi/2; //将要在循环中重复的计算提取出来,减少时间复杂度
int zoomR=r-20; //绘制表盘 //zoomR 及对 zoomR 进行加或减操作主要是用来控制距离圆心的距离
dcMem.SetBkMode(TRANSPARENT);
for(int mark=1;mark<=60;mark++)
{
int positionX = (int)(zoomR * sin(rate * mark)+ x0);
int positionY = (int)(-zoomR * sin(rate * mark +halfPi)+ y0);
if(mark%5 ==0) //绘制数值
{
char number[2];
itoa(mark/5,number,10);//按照十进制转换
dcMem.TextOut(positionX-5,positionY-5,number);
}
else //绘制刻度
{
dcMem.SetPixel(positionX,positionY,RGB(200,100,0));
dcMem.Ellipse(positionX-2,positionY-2,positionX+2,positionY+2);
}
}
CTime time = CTime::GetCurrentTime(); //获取系统时间
int hour=time.GetHour(); int minute= time.GetMinute(); int second= time.GetSecond();
int year=time.GetYear();int month=time.GetMonth();int day=time.GetDay();
int t=hour=(hour+m_listBox.GetCurSel()+4)%24;
CString s=””;char a[2];
if(m_pBool&&t>12)
t=hour-12;
if(t==0&&m_pBool)
t+=12;
itoa(t,a,10);
if(t<10)
{
s.Insert(s.GetLength(),”0″);
s.Insert(s.GetLength(),a);
}
else
s.Insert(s.GetLength(),a);
s.Insert(s.GetLength(),”:”);
itoa(minute,a,10);
if(minute<10)
{
s.Insert(s.GetLength(),”0″);
s.Insert(s.GetLength(),a);
}
else
s.Insert(s.GetLength(),a);
s.Insert(s.GetLength(),”:”);
itoa(second,a,10);
if(second<10)
{
s.Insert(s.GetLength(),”0″);
s.Insert(s.GetLength(),a);
}
else
s.Insert(s.GetLength(),a);
if(m_pBool)
{
if(hour>=12)
SetDlgItemText(IDC_STATIC_TITLE,”pm”);//在名为IDC_curtime的控件里显示字符串str
else
SetDlgItemText(IDC_STATIC_TITLE,”am”);//在名为IDC_curtime的控件里显示字符串str
}
else
{
SetDlgItemText(IDC_STATIC_TITLE,””);//在名为IDC_curtime的控件里显示字符串str
}
SetDlgItemText(IDC_STATIC_CLOCK,s);//在名为IDC_curtime的控件里显示字符串str
double hourRate=(double)(2.0*pi/12.0); //时钟每小时走过角度大小
if(hour>12)//若时针超过12时
{
hour-=12;
}
CPen hourPen(PS_SOLID,7,m_HourColor); //设置时针的颜色
dcMem.SelectObject(hourPen);
dcMem.MoveTo(CPoint(x0,y0)); //时针直线起始位置
int hourX=(int)((zoomR-110)*sin(hourRate*(hour+minute/60.0))+x0);
int hourY=(int)(-(zoomR-110)*sin(hourRate *(hour+minute/60.0)+halfPi)+ y0);
dcMem. LineTo(CPoint(hourX,hourY));//时针直线结束位置
CPen minutePen(PS_SOLID,5,m_MinuteColor); //设置分针的颜色
dcMem.SelectObject(minutePen); //绘制分钟数指针
dcMem.MoveTo(CPoint(x0,y0)); //分针直线起始位置
int minuteX=(int)((zoomR-70)*sin(rate*(minute+second/60.0))+ x0);
int minuteY=(int)(-(zoomR-70)*sin(rate*(minute+second/60.0)+halfPi)+ y0);
dcMem.LineTo(CPoint(minuteX,minuteY)); //分针直线结束位置
CPen secondPen(PS_SOLID,2,m_SecondColor);//设置秒针的颜色
dcMem.SelectObject(secondPen); //绘制秒针
dcMem.MoveTo(CPoint(x0,y0));//秒针直线起始位置
int secondX=(int)((zoomR-25)*sin(rate*second)+x0);
int secondY=(int)(-(zoomR-25) * sin(rate * second +halfPi)+ y0);
dcMem.LineTo(CPoint(secondX,secondY)); //秒针直线结束位置
pDC->BitBlt(0, 0, rect.Width(), rect.Height(),
&dcMem, 0, 0, SRCCOPY);
dcMem.DeleteDC();// 删除DC
bmp.DeleteObject();// 删除位图
SetTimer(1, 1000, NULL);//创建或设置一个定时器
// TODO: Add your message handler code here
// Do not call CDialog::OnPaint() for painting messages
}
void CMyDialog1::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Invalidate(FALSE);
CDialog::OnTimer(nIDEvent);
}
HBRUSH CMyDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID() ==IDC_STATIC_CLOCK)
{
pDC->SetTextColor(m_FontColor);//用RGB宏改变颜色
HBRUSH b=CreateSolidBrush(m_BkFontColor);//控件背景色
pDC->SetBkColor(m_BkFontColor);
return b;
}
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CMyDialog1::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_pBool=false;
CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);//将OnRadio1(24时)设为选中状态
m_listBox.SetCurSel(20);//将组合框IDC_LIST1中“东八区”设为选中状态
SetDlgItemText(IDC_STATIC_TITLE,” “);//在名为IDC_curtime的控件里显示字符串str
CButton* popenbtn=(CButton*)GetDlgItem(IDCANCEL);
popenbtn->SetFocus();//设置按钮焦点在返回主目录上
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMyDialog1::OnRadio1()
{
// TODO: Add your control notification handler code here
m_pBool=false;
}
void CMyDialog1::OnRadio2()
{
// TODO: Add your control notification handler code here
m_pBool=true;
}
void CMyDialog1::OnButton1()
{
// TODO: Add your control notification handler code here
CDialog4 dlg;
dlg.DoModal();
}
要想返回主目录、调用作者信息对话框和使用sin()函数,需增加头文件;项目切换到工作区间,选择头文件中“CMyDialog1.cpp”,在下列位置添加如下代码(红色为新加代码):
#include “stdafx.h”
#include “CWindowsDazuoye.h”
#include “CWindowsDazuoyeDlg.h”
#include “MyDialog1.h”
#include “Dialog4.h”//作者信息头文件,见对话框4
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
按“Ctrl+R”(或者选择“插入”→“资源”),在弹出对话框选择双击“Dialog”(或者切换到ResourceView页面,展开所有资源节点,单击Dialog,在弹出对话框中选择“插入 Dialog”)。并右击对话框修改其标题为“windows程序设计第二组–计算器—错误提示” (仿照 三.1.创建对话框CMyDialog1步骤)
删除该模板上除确定按钮以外的控件。并按要求和表5、图20-2所示内容,向对话框模板中加入控件(参照 三.2设计CMyDialog1的步骤,其中静态图片属性如图 21所示)
图 20-2
表5 控件属性
控件类型 |
ID |
标题 |
其他属性 |
分组框 |
默认 |
温馨提示: |
默认 |
静态文本 |
默认 |
操作有误! |
默认 |
静态图片 |
默认 |
|
在类型下拉框中选择位图,图像下拉框中选择IDB_BITMAP2 |
命令按钮 |
IDOK |
确定 |
默认 |
图 21
单击对话框,按“Ctrl+W”(或者右击,在弹出的对话框中选择“建立类向导”或者选择“查看”→“建立类向导”),在弹出的对话框(如图 16所示),选择“OK”按钮,然后建立一个新类“CMyDialog0”(可以为任意名)。(仿照三. 3.关联变量步骤)
按“Ctrl+R”(或者选择“插入”→“资源”),在弹出对话框选择双击“Dialog”(或者切换到ResourceView页面,展开所有资源节点,单击Dialog,在弹出对话框中选择“插入 Dialog”)。并右击对话框修改其标题为“windows程序设计第二组–计算器”(仿照 三.1.创建对话框CMyDialog1步骤)
并按要求和表6、图 22所示内容,向对话框模板中加入控件。(参照 三.2设计CMyDialog1的步骤)
图 22
表 6 控件属性
控件类型 |
ID |
标题 |
其他属性 |
编辑框 |
IDC_EDIT1 |
|
在样式中的排列文本下拉框中选定靠右,取消自动水平滚动,选定只读和边框属性 |
静态文本 |
IDC_STATIC_MS |
寄数器状态 |
在样式中的排列文本下拉框中选定居中,选定垂直居中和边框属性 |
分组框 |
默认 |
|
默认 |
单选按钮 |
IDC_RADIO3 |
角度 |
默认 |
单选按钮 |
IDC_RADIO4 |
弧度 |
默认 |
单选按钮 |
IDC_RADIO5 |
梯度 |
默认 |
命令按钮 |
IDC_BUTTON_M1 |
M+ |
默认 |
命令按钮 |
IDC_BUTTON_M2 |
M- |
默认 |
命令按钮 |
IDC_BUTTON_MR |
MR |
默认 |
命令按钮 |
IDC_BUTTON_MS |
MS |
默认 |
命令按钮 |
IDC_BUTTON_SINH |
sinh |
默认 |
命令按钮 |
IDC_BUTTON_ASIN |
asin |
默认 |
命令按钮 |
IDC_BUTTON_SIN |
sin |
默认 |
命令按钮 |
IDC_BUTTON_DE |
← |
默认 |
命令按钮 |
IDC_BUTTON_CE |
CE |
默认 |
命令按钮 |
IDC_BUTTON_C |
C |
默认 |
命令按钮 |
IDC_BUTTON_FA |
|x| |
默认 |
命令按钮 |
IDC_BUTTON_MC |
MC |
默认 |
命令按钮 |
IDC_BUTTON_COSH |
cosh |
默认 |
命令按钮 |
IDC_BUTTON_ACOS |
acos |
默认 |
命令按钮 |
IDC_BUTTON_COS |
cos |
默认 |
命令按钮 |
IDC_BUTTON_7 |
7 |
默认 |
命令按钮 |
IDC_BUTTON_8 |
8 |
默认 |
命令按钮 |
IDC_BUTTON_9 |
9 |
默认 |
命令按钮 |
IDC_BUTTON_DIV |
/ |
默认 |
命令按钮 |
IDC_BUTTON_PER |
% |
默认 |
命令按钮 |
IDC_BUTTON_SU |
– |
默认 |
命令按钮 |
IDC_BUTTON_ATAN |
atan |
默认 |
命令按钮 |
IDC_BUTTON_TAN |
tan |
默认 |
命令按钮 |
IDC_BUTTON_4 |
4 |
默认 |
命令按钮 |
IDC_BUTTON_5 |
5 |
默认 |
命令按钮 |
IDC_BUTTON_6 |
6 |
默认 |
命令按钮 |
IDC_BUTTON_MUL |
* |
默认 |
命令按钮 |
IDC_BUTTON_EQ |
= |
默认 |
命令按钮 |
IDC_BUTTON_LN |
ln |
默认 |
命令按钮 |
IDC_BUTTON_EXP |
exp |
默认 |
命令按钮 |
IDC_BUTTON_LOG |
lg |
默认 |
命令按钮 |
IDC_BUTTON_1 |
1 |
默认 |
命令按钮 |
IDC_BUTTON_2 |
2 |
默认 |
命令按钮 |
IDC_BUTTON_3 |
3 |
默认 |
命令按钮 |
IDC_BUTTON_N |
n! |
默认 |
命令按钮 |
IDC_BUTTON_MOD |
取小数 |
默认 |
命令按钮 |
IDC_BUTTON_INT |
取整 |
默认 |
命令按钮 |
IDC_BUTTON_0 |
0 |
默认 |
命令按钮 |
IDC_BUTTOND |
. |
默认 |
命令按钮 |
IDC_BUTTON_PI |
π |
默认 |
命令按钮 |
IDC_BUTTON_ADD |
+ |
默认 |
命令按钮 |
IDC_BUTTON_RE |
1/X |
默认 |
命令按钮 |
IDC_BUTTON_X2 |
x^2 |
默认 |
命令按钮 |
IDC_BUTTON_XY |
x^y |
默认 |
命令按钮 |
IDC_BUTTON_10X |
10^X |
默认 |
命令按钮 |
IDC_BUTTON_PI |
π |
默认 |
命令按钮 |
IDC_BUTTON_X3 |
x^3 |
默认 |
命令按钮 |
IDC_BUTTON_SQROOT |
√x |
默认 |
命令按钮 |
IDC_BUTTON_3X |
3√x |
默认 |
命令按钮 |
IDC_BUTTON_YX |
y√x |
默认 |
命令按钮 |
IDOK |
结束程序 |
默认 |
命令按钮 |
IDC_BUTTON |
作者信息 |
默认 |
命令按钮 |
IDCANCEL |
返回主目录 |
默认 |
(仿照三. 3.关联变量步骤)建立新类“CDialog2”并按“表 7CTestCtrl3Dlg类的控件关联变量”关联变量
表 7 CTestCtrl3Dlg类的控件关联变量
控件ID |
变量类型 |
变量名 |
IDC_EDIT1 |
CEdit |
m_fEdit |
(仿照三. 4.添加成员变量步骤和三.5.添加静态成员变量)添加代码如下(红色代码为新加代码):
…
DECLARE_MESSAGE_MAP()
protected:
static double d_op1,d_op2;//两个double型操作数
static char ch;//表示运算符
static CString str1[2];
static int pBool;//角度,弧度,梯度选择
CFont m_editFont;
};
//{{AFX_INSERT_LOCATION}}
…
(仿照三. 5.初始化静态成员变量)(红色代码)并定义静态全局变量(蓝色代码)
…
#endif
/////////////////////////////////////////////////////////////////////////////
// CDialog2 dialog
int CDialog2::pBool=1;
double ms;//ms操作保存的数
int di=0;//str中小数点个数标记
static const double pi=3.14159265358979323846; //π的取值
CMyDialog0 dlg0;//出错提示
CString CDialog2::str1[2];//字符串
double CDialog2::d_op1,CDialog2::d_op2;//数值
char CDialog2::ch=\’ \’;//运算符初始化
CDialog2::CDialog2(CWnd* pParent /*=NULL*/)
: CDialog(CDialog2::IDD, pParent)
{
…
(仿照三. 6.添加消息处理函数)并按照表 8 CDialog2的控件通知消息处理函数的要求
表 8 CDialog2的控件通知消息处理函数
控件ID |
消息 |
消息处理函数 |
IDC_RADIO3 |
BN_CLICKED |
默认 |
IDC_RADIO4 |
BN_CLICKED |
默认 |
IDC_RADIO5 |
BN_CLICKED |
默认 |
IDC_BUTTON_M1 |
BN_CLICKED |
默认 |
IDC_BUTTON_M2 |
BN_CLICKED |
默认 |
IDC_BUTTON_MR |
BN_CLICKED |
默认 |
IDC_BUTTON_MS |
BN_CLICKED |
默认 |
IDC_BUTTON_SINH |
BN_CLICKED |
默认 |
IDC_BUTTON_ASIN |
BN_CLICKED |
默认 |
IDC_BUTTON_SIN |
BN_CLICKED |
默认 |
IDC_BUTTON_DE |
BN_CLICKED |
默认 |
IDC_BUTTON_CE |
BN_CLICKED |
默认 |
IDC_BUTTON_C |
BN_CLICKED |
默认 |
IDC_BUTTON_FA |
BN_CLICKED |
默认 |
IDC_BUTTON_MC |
BN_CLICKED |
默认 |
IDC_BUTTON_COSH |
BN_CLICKED |
默认 |
IDC_BUTTON_ACOS |
BN_CLICKED |
默认 |
IDC_BUTTON_COS |
BN_CLICKED |
默认 |
IDC_BUTTON_7 |
BN_CLICKED |
默认 |
IDC_BUTTON_8 |
BN_CLICKED |
默认 |
IDC_BUTTON_9 |
BN_CLICKED |
默认 |
IDC_BUTTON_DIV |
BN_CLICKED |
默认 |
IDC_BUTTON_PER |
BN_CLICKED |
默认 |
IDC_BUTTON_SU |
BN_CLICKED |
默认 |
IDC_BUTTON_ATAN |
BN_CLICKED |
默认 |
IDC_BUTTON_TAN |
BN_CLICKED |
默认 |
IDC_BUTTON_4 |
BN_CLICKED |
默认 |
IDC_BUTTON_5 |
BN_CLICKED |
默认 |
IDC_BUTTON_6 |
BN_CLICKED |
默认 |
IDC_BUTTON_MUL |
BN_CLICKED |
默认 |
IDC_BUTTON_EQ |
BN_CLICKED |
默认 |
IDC_BUTTON_LN |
BN_CLICKED |
默认 |
IDC_BUTTON_EXP |
BN_CLICKED |
默认 |
IDC_BUTTON_LOG |
BN_CLICKED |
默认 |
IDC_BUTTON_1 |
BN_CLICKED |
默认 |
IDC_BUTTON_2 |
BN_CLICKED |
默认 |
IDC_BUTTON_3 |
BN_CLICKED |
默认 |
IDC_BUTTON_N |
BN_CLICKED |
默认 |
IDC_BUTTON_MOD |
BN_CLICKED |
默认 |
IDC_BUTTON_INT |
BN_CLICKED |
默认 |
IDC_BUTTON_0 |
BN_CLICKED |
默认 |
IDC_BUTTOND |
BN_CLICKED |
默认 |
IDC_BUTTON_PI |
BN_CLICKED |
默认 |
IDC_BUTTON_ADD |
BN_CLICKED |
默认 |
IDC_BUTTON_RE |
BN_CLICKED |
默认 |
IDC_BUTTON_X2 |
BN_CLICKED |
默认 |
IDC_BUTTON_XY |
BN_CLICKED |
默认 |
IDC_BUTTON_10X |
BN_CLICKED |
默认 |
IDC_BUTTON_PI |
BN_CLICKED |
默认 |
IDC_BUTTON_X3 |
BN_CLICKED |
默认 |
IDC_BUTTON_SQROOT |
BN_CLICKED |
默认 |
IDC_BUTTON_3X |
BN_CLICKED |
默认 |
IDC_BUTTON_YX |
BN_CLICKED |
默认 |
IDOK |
BN_CLICKED |
默认 |
IDC_BUTTON |
BN_CLICKED |
默认 |
IDCANCEL |
BN_CLICKED |
默认 |
IDC_BUTTON_X3 |
BN_CLICKED |
默认 |
IDC_BUTTON_SQROOT |
BN_CLICKED |
默认 |
CDialog2 |
WM_INITDIALOG |
默认 |
CDialog2 |
WM_CTLCOLOR |
默认 |
项目切换到工作区间,选择头文件中“CDialog2.h”,在下列位置添加如下代码(红色为新加代码):
…
double CDialog2::d_op1,CDialog2::d_op2;//数值
char CDialog2::ch=\’ \’;//运算符初始化
int fact(int n)//求n的阶乘
{
int sum;
if (n==1)
return 1;
else
{
sum=n*fact(n-1);
return sum;
}
}
CDialog2::CDialog2(CWnd* pParent /*=NULL*/)
: CDialog(CDialog2::IDD, pParent)
{
…
要想返回主目录、调用出错信息对话框、调用作者信息对话框和使用数学库函数,需增加头文件;项目切换到工作区间,选择头文件中“CDialog2.cpp”,在下列位置添加如下代码(红色为新加代码)初始化静态成员变量:
(仿照 三.1.创建对话框CMyDialog1步骤)并右击对话框修改其标题为“windows程序设计第二组–计算器”
并按要求和表9、图 23所示内容,向对话框模板中加入控件。(参照 三.2设计CMyDialog1的步骤)
图 23
表9 控件属性
控件类型 |
ID |
标题 |
其他属性 |
静态文本 |
默认 |
日期1: |
默认 |
静态文本 |
默认 |
日期2: |
默认 |
日期时间选取控件 |
IDC_DATETIMEPICKER1 |
|
在样式中格式下拉框中选择长日期,选定允许编辑 |
日期时间选取控件 |
IDC_DATETIMEPICKER2 |
|
在样式中格式下拉框中选择长日期,选定允许编辑 |
分组框 |
默认 |
计算两个日期之差 |
默认 |
静态文本 |
IDC_STATIC_DATE |
0 |
在样式中的排列文本下拉框中选定居中,并选中垂直居中,凹陷和边框属性 |
命令按钮 |
IDC_BUTTON_CACL1 |
计算 |
默认 |
分组框 |
默认 |
日期1加上或减去天数 |
默认 |
编辑框 |
IDC_EDIT1 |
|
在样式中的排列文本下拉框中选定居中,选定数字 |
单选按钮 |
IDC_RADIO1 |
加上+ |
默认 |
单选按钮 |
IDC_RADIO2 |
减去- |
默认 |
命令按钮 |
IDC_BUTTON_CACL2 |
计算 |
默认 |
命令按钮 |
IDOK |
结束程序 |
默认 |
命令按钮 |
IDC_BUTTON2 |
作者信息 |
默认 |
命令按钮 |
IDCANCEL |
返回主目录 |
默认 |
(仿照三. 3.关联变量步骤)建立新类“CDialog3”并按“表 10CDialog3类的控件关联变量”关联变量
(其中关联IDC_EDIT1的成员变量时,设置取值范围(0~450000),因为过大会导致系统崩溃,如图 24所示)
表 10 CDialog3类的控件关联变量
控件ID |
变量类型 |
变量名 |
IDC_DATETIMEPICKER1 |
CDateTimeCtr |
m_CtrlTime1 |
IDC_DATETIMEPICKER2 |
CDateTimeCtr |
m_CtrlTime1 |
IDC_EDIT1 |
int |
m_Edit |
图 24
(仿照三. 4.添加成员变量步骤)
表 11 CDialog3类成员变量
变量类型 |
变量名称 |
访问权限 |
BOOL |
m_pBool |
Protected |
或者项目切换到工作区间,选择头文件中“CDialog3.h”z在下列位置添加如下代码(红色为新加代码):
…
afx_msg void OnButton2();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
protected:
BOOL p_Bool;
};
//{{AFX_INSERT_LOCATION}}
…
(仿照三. 6.添加消息处理函数)按表 12 CDialog3的控件通知消息处理函数添加消息处理函数
表 12 CDialog3的控件通知消息处理函数
控件ID |
消息 |
消息处理函数 |
IDC_BUTTON_CACL1 |
BN_CLICKED |
默认 |
IDC_RADIO1 |
BN_CLICKED |
默认 |
IDC_RADIO2 |
BN_CLICKED |
默认 |
IDC_BUTTON_CACL2 |
BN_CLICKED |
默认 |
IDOK |
BN_CLICKED |
默认 |
IDC_BUTTON2 |
BN_CLICKED |
默认 |
IDCANCEL |
BN_CLICKED |
默认 |
CDialog3 |
WM_INITDIALOG |
默认 |
要想返回主目录和调用作者信息对话框,需增加头文件;项目切换到工作区间,选择头文件中“CDialog3.cpp”,在下列位置添加如下代码(红色为新加代码):
…
#include “stdafx.h”
#include “CWindowsDazuoye.h”
#include “Dialog3.h”
#include “CWindowsDazuoyeDlg.h”
#include “Dialog4.h”
#ifdef _DEBUG
#define new DEBUG_NEW
…
(仿照 三.1.创建对话框CMyDialog1步骤)并右击对话框修改其标题为“windows程序设计第二组—作者信息”并设置字体大小和字体类型(如图 25所示)
图 25
并按要求和表13、图 26所示内容,向对话框模板中加入控件。(参照 三.2设计CMyDialog1的步骤)
图 26
表13 控件属性
控件类型 |
ID |
标题 |
其它属性 |
静态图片 |
默认 |
|
|
静态文本 |
默认 |
windows课程设计大作业 |
默认 |
分组框 |
默认 |
|
|
静态文本 |
默认 |
所属学院: 计 算 机 学 院\n所属专业: 软 件 工 程 \n所属班级: 软 件 113 班\n指导老师: * * *\n课程名称:windows程序设计\n所属小组: 软件113班第二组 |
默认 |
静态文本 |
默认 |
***********\n***********\n*********** |
默认 |
命令按钮 |
IDCANCEL |
结束程序 |
默认 |
命令按钮 |
IDOK |
返回 |
默认 |
(仿照三. 3.关联变量步骤)建立新类“CDialog4”并添加IDCANCEL的消息处理函数
(仿照 七.1.创建对话框CDialog1步骤)并右击对话框修改其标题为“windows程序设计第二组–主目录”并设置与之相同类型的字体大小和字体类型
2.设计IDD_CWINDOWSDAZUOYE_DIALOG对话框
删除该模板上除确定按钮以外的控件。并按要求和表14、图27所示内容,向对话框模板中加入控件(参照 三.2设计CMyDialog1的步骤)
图 27
表 14 控件属性
控件类型 |
ID |
标题 |
其他属性 |
分组框 |
默认 |
作者简略信息 |
默认 |
静态文本 |
默认 |
***********\n***********\n*********** |
默认 |
命令按钮 |
IDC_BUTTON1 |
钟表和电子钟 |
默认 |
命令按钮 |
IDC_BUTTON_CACL |
计算器 |
默认 |
命令按钮 |
IDC_BUTTON2 |
日期和天数计算 |
默认 |
命令按钮 |
IDC_BUTTON3 |
作者信息 |
默认 |
命令按钮 |
IDOK |
结束程序 |
默认 |
(仿照三. 3.关联变量步骤)按表 15 CCWindowsDazuoyeDlg的控件通知消息处理函数添加消息处理函数
表 15 CCWindowsDazuoyeDlg的控件通知消息处理函数
控件ID |
消息 |
消息处理函数 |
IDC_BUTTON1 |
BN_CLICKED |
默认 |
IDC_BUTTON_CACL |
BN_CLICKED |
默认 |
IDC_BUTTON2 |
BN_CLICKED |
默认 |
IDC_BUTTON3 |
BN_CLICKED |
默认 |
项目切换到工作区间,选择头文件中“CWindowsDazuoyeDlg.cpp”,在在下列位置添加如下代码(红色为新加代码):
// CWindowsDazuoyeDlg.cpp : implementation file
//
#include “stdafx.h”
#include “CWindowsDazuoye.h”
#include “CWindowsDazuoyeDlg.h”
#include”MyDialog1.h”
#include”Dialog2.h”
#include “CWindowsDazuoye.h”
#include “Dialog3.h”
#include “Dialog4.h”
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
…
运行结果如图 28-图30所示
图 28
图 29
图 30
1.在最终编译执行时,有一些错误,不能执行程序,在小组各人员的努力下终于找到了原因。
2.在本次程序编写中,运到的最大的困难:钟表的绘画,试了许多办法,终于在小组的讨论中,突发奇想,直接在对话框中绘图,不使用任何控件,结果证明想法正确。然后是图片的闪烁问题,经过本小组讨论和网上的方法,最终使用的双缓冲区,但是还是有部分会闪烁,使用局部更新,一些控件得不到显示,这也是本次程序的一些遗憾
3.在运行中,本程序还出过了其它的一些小错误,不过,经过本小组的精心调试,终于可以正确运行了.
通过本题大作业,让我们小组更加熟悉了mfc的创建和使用方法及技巧,知道了各自的不足,相信我们今后将会更加熟练的运用通mfc。由于本小组人员有限,知识能力有限,时间有限,这次windows大作业,最后并没能达到所预期的效果,如:钟表和电子钟显示时有些控件回来回闪动(虽然表盘不动)计划着写一个科学计算器(能计算表达式),但由于种种原因,并没能写成,深感遗憾!虽然没能及时的完整做完这次实验,但通过本次试验计培养了我们对这些实际问题的分析能力、解决一些实际问题的能力和团队合作能力。通过编程,巩固了我们对编程思想和写程序的能力。
最后,我要向百忙之中抽时间对本次作业进行审阅,评议和参与本小组论文答辩的陆老师表示感谢!
Windows程序设计第二组