软件开发与实践报告.doc_第1页
软件开发与实践报告.doc_第2页
软件开发与实践报告.doc_第3页
软件开发与实践报告.doc_第4页
软件开发与实践报告.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实 验 报 告2015 2016 学年 第 二 学期实 验 课 程 软件开发与实践学 生 姓 名*实 验 项 目时钟GUI控件学 院计算机科学技术学院实 验 性 质上机实验班 级 学 号*实 验 地 点研1213同 组 人 数第 组实 验 日 期第 周 星期 第 节成 绩环 境 参 数一、 实验目的及要求二、实验原理、实验内容三、实验仪器设备及材料四、操作方法与实验步骤五、实验数据记录及处理六、 实验结果分析及讨论一、实验目的及要求设计一个时钟GUI控件,控件包括一个表盘(表盘边缘上有60条细刻度线12条出粗刻度线)以及时分秒针,控件能自动读取当前系统时间,并以时分秒的形式显示。控件每秒读取一次计算机系统时间,并完成时钟指针的显示更新。在GUI应用程序中可以利用时钟控件创建多个时钟实例,并显示在应用程序的窗口界面程序设计报告:word文档,在程序设计报告中需要详细的写出时钟控件的设计思想,画出主要的类图,活动图以及重要子函数的的程序流程图,并以附录的形式给出完整代码二、 实验原理、实验内容主要问题: 1.首先想到的是如何绘制指针式的图形时钟,通过查询资料可知,要在Cwnd基类下创建Windows子窗口,然后从此继承一个类,在派生类中实现消息处理成员函数和消息映射,以指定当消息被发送到窗口时应该如何动作。 2.程序调试时,出现以下错误:unresolved external symbol _endthreadex,错误现象具体为:nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved externalsymbol _beginthreadexDebug/jnHid.exe:fatal error LNK1120:2 unresolved externalsError executing link.exe.错误提示为:nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _beginthreadexlibcd.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/Hello.exe : fatal error LNK1120: 3 unresolved externals通过查询资料后可知,解决步骤如下;1.在VC+6.0编译环境中进行下列操作:“Project”-“settings”-“c/c+”“Catagory” 选择“Code Generation”“use run-time library”选择“debug multithreaded”到此处解决一般问题,如果又一下错误提示:libcmtd.lib(crt0.obj) : error LNK2001: unresolved external通过查询资料后可知,解决步骤如下;1.在VC+6.0编译环境中进行下列操作:“Project”-“settings”-“c/c+”“Catagory” 选择“Code Generation”“use run-time library”选择“debug multithreaded”到此处解决一般问题,如果又一下错误提示:libcmtd.lib(crt0.obj) : error LNK2001: unresolved externalsymbol _mainDebug/Hello.exe : fatal error LNK1120: 1 unresolved externals,则进行第2步操作2. Project - Settings - 选择Link属性页,在Project Options中将/subsystem:console改成/subsystem:windows.此时确定解决一般问题.程序设计基本概念和原理MFC窗口类CWnd:在Windows系统里,一个窗口的属性分两个地方存放:一部分放在“窗口类”里头,如上所述的在注册窗口时指定;另一部分放在Windows Object本身,如:窗口的尺寸,窗口的位置(X,Y轴),窗口的Z轴顺序,窗口的状态,和其他窗口的关系,窗口是否可以接收键盘或鼠标消息,等等。为了表达所有这些窗口的共性,MFC设计了一个窗口基类CWnd。有一点非常重要,那就是CWnd提供了一个标准而通用的MFC窗口过程,MFC下所有的窗口都使用这个窗口过程。至于通用的窗口过程却能为各个窗口实现不同的操作.CFrameWnd类:CFrameWnd类往往用于创建应用程序的主窗口,因为它能很好地支持系统菜单和控制条,为此定义了大量的成员函数和变量。在编写文档/视图结构的应用程序时,CFrameWnd作为主窗口管理视图和文档对象。视图对象和控制条都成为CFrameWnd的子窗口,它们分享客户区,其位置被CFrameWnd有效地排列。 CFrameWnd直接支持单文档界面,对于多文档界面,使用其派生类CMDIFrameWnd和CMDIChildWnd.GetLocalTime函数GetLocalTime是一个Windows API 函数,用来获取当地的当前系统日期和时间.Onpaint:在C+中Onpaint是WM_PAINT消息的消息处理函数,Onpaint()是Cwnd的类成员,负责响应WM_PAINT.基本原理:本次课程设计是基于面向对象的应用程序设计,主要运用C+语言在VC+开发环境下的MFC中编程实现。模拟时钟的基本功能是程序初始在屏幕上有一指针式时钟表盘,表盘为圆形,内部分布有12个刻度,表盘上有三个长度和形状不同的时针分针和秒针,相互之间容易辨认,指针的运动通过数学推导之后以代码实现,且时钟显示时间与系统时间是一致的.三、实验仪器设备及材料台式机电脑、Visual C+ 6.0四、操作方法与实验步骤(1) 绘制指针式的时钟和数字式的时钟图形时,要在CWnd类下进行。其中OnPaint()函数在绘制视图窗口时被调用, 在定义了画刷CBrush和画笔CPen之后,调用GetClientRect()定义屏幕大小并确定椭圆中心的坐标,然后调用Ellipse绘制椭圆,即指针式的时钟表盘,调用MoveTo()和LineTo()绘制表盘指针。(2) 模拟时钟处理消息的过程:首先调用SetTimer函数定义时钟消息,包括参数指定计时器的ID,消息产生的时间间隔,回调函数为NULL;调用消息处理函数OnTimer()刷新窗口显示。在相应的WM_TIMER消息处理里添加时钟消息响应代码;最后调用KillTimer释放该时钟。(3) 要实现时钟的动态效果,即时间窗显示的时间每隔一秒钟更新一次,要定时更新,则应利用WM_TIMER消息,计时器每隔一定的时间间隔就会发出一个WM_TIMER消息,而这个时间间隔可由用户指定。MFC的Windows类提供了WM_TIMER消息处理函数OnTimer(),应在该函数内进行更新时间窗格的工作。先利用ClassWazard给CMainFrame类加入WM_TIMER消息处理函数OnTimer(),CMainFrame: OnTimer()函数是在系统发给框架窗口消息WM_TIMER时调用的,在CMainFrame:OnCreate()函数内调用CWnd:SetTimer()以安装一个计时器,使OnTimer()在设定的时间间隔被调用。(4) 通过调用GetCurrentTime()函数来实现时钟时间与计算机系统时间保持一致.开始流程图:创建应用程序MFC主窗口定义画笔Cpen和画刷CBrush定义屏幕大小并确定椭圆中心坐标GetClientRect()调用SetTimer()函数设置时间间隔 获取当前系统时间GetLocaTime()调用MoveTo()和LineLineTo()绘制时钟中面的指针和刻度调用消息处理函数Onpaint()刷新窗口显示 时间显示 退出 程序结束类图:五、实验数据记录及处理获取系统时间:SYSTEMTIME st;GetLocalTime(&st);定义时分秒显示时间:double h, m, s;s = st.wSecond;m = st.wMinute + s/60;h = st.wHour + m/60;定义消息处理函数:void CMyWnd:OnPaint()RECT rect;GetClientRect(&rect);POINT mid;mid.x = rect.right / 2;mid.y = rect.bottom / 2;int l, t, r, b;double rr;if(rect.right rect.bottom) l = (rect.right - rect.bottom) / 2;t = 0;r = rect.bottom + l;b = rect.bottom;rr = b/2; else l = 0;t = (rect.bottom - rect.right) / 2;r = rect.right;b = rect.right + t;rr = r/2;调用MoveTo()和LineTo()函数,绘制时钟钟面的指针和刻度,使指针按照系统时间转动:for(int i = 0; i 360; i += 6)if(i % 30 = 0)len = rr/10;elselen = rr/20;p1.x = (rr-len)*cos(i/AG) + mid.x;p1.y = (rr-len)*sin(i/AG) + mid.y;p2.x = rr*cos(i/AG) + mid.x;p2.y = rr*sin(i/AG) + mid.y;m_memDC.MoveTo(p1.x, p1.y);m_memDC.LineTo(p2.x, p2.y);源代码:#include #include class CMyWnd : public CFrameWnd/从Cwnd继承一个MFC窗口基类public:CMyWnd();protected:afx_msg void OnPaint();/声明消息处理函数afx_msg void OnSize(UINT uType, int cx, int cy);/声明函数Onsize实现窗口大小更改afx_msg BOOL OnEraseBkgnd(CDC* pDC);/背景处理afx_msg void OnTimer(UINT_PTR nIdEvent);/实现定时控制功能afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/窗口生成DECLARE_MESSAGE_MAP()private:CDC m_memDC;/声明一个CDC对象m_memDC;class CMyApp : public CWinApppublic:virtual BOOL InitInstance()/创建模态对话框m_pMainWnd = new CMyWnd;m_pMainWnd-ShowWindow(m_nCmdShow);/设置当前窗口显示状态m_pMainWnd-UpdateWindow();/更新区域为空,不发送消息到达当前窗口客户区m_pMainWnd-SetTimer(10, 1000, NULL);/创建定时器,设置时间间隔return TRUE;CMyApp myApp;BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)ON_WM_CREATE()ON_WM_SIZE()ON_WM_ERASEBKGND()ON_WM_PAINT()ON_WM_TIMER()END_MESSAGE_MAP()int CMyWnd:OnCreate(LPCREATESTRUCT lpCreateStruct)CDC * pDC = GetDC();/根据指定的等级类型检索指定窗口DC环境this-m_memDC.CreateCompatibleDC(pDC);ReleaseDC(pDC);/函数释放DC供其它函数使用return 0;BOOL CMyWnd:OnEraseBkgnd(CDC* pDC)/擦除背景,为绘图准备无效区域return TRUE;void CMyWnd:OnSize(UINT uType, int cx, int cy)/定义窗口更改函数OnsizeCBitmap tmp;CDC * pDC = GetDC();tmp.CreateCompatibleBitmap(pDC, cx, cy);/创建与指定设备相关的位图m_memDC.SelectObject(&tmp);/替换相同类型对象tmptmp.DeleteObject();/删除逻辑画笔,释放对象CBrush brush(RGB(255,255,255);/为画刷对象赋初值m_memDC.FillRect(CRect(0, 0, cx, cy),&brush);ReleaseDC(pDC);CMyWnd:CMyWnd()Create(NULL, _T (MFC时钟);void CMyWnd:OnTimer(UINT_PTR nIdEvent)Invalidate();/使当前整个窗口无效void CMyWnd:OnPaint()/定义消息处理函数OnpaintRECT rect;GetClientRect(&rect);/获取窗口坐标POINT mid;mid.x = rect.right / 2;mid.y = rect.bottom / 2;int l, t, r, b;double rr;if(rect.right rect.bottom) l = (rect.right - rect.bottom) / 2;t = 0;r = rect.bottom + l;b = rect.bottom;rr = b/2; else l = 0;t = (rect.bottom - rect.right) / 2;r = rect.right;b = rect.right + t;rr = r/2;m_memDC.Ellipse(l, t, r, b);/调用椭圆函数m_memDC.SetPixel(mid.x, mid.y, RGB(0, 0, 0);/将该坐标下的像素设为指定颜色const double PI = 4.0 * atan( 1.0 );const double AG = 180.0 / PI;POINT p1, p2, p3;int len;#pragma warning(push)#pragma warning(disable:4244)for(int i = 0; i 360; i += 6)if(i % 30 = 0)len = rr/10;elselen = rr/20;p1.x = (rr-len)*cos(i/AG) + mid.x;p1.y = (rr-len)*sin(i/AG) + mid.y;p2.x = rr*cos(i/AG) + mid.x;p2.y = rr*sin(i/AG) + mid.y;m_memDC.MoveTo(p1.x, p1.y);/将CP移到(x, y) m_memDC.LineTo(p2.x, p2.y);/用当前画笔画一条线,从当前位置连到一个指定的点。函数调用完毕,当前位置变成x,ySYSTEMTIME st;GetLocalTime(&st);/获取当前系统时间double h, m, s;s = st.wSecond;m = st.wMinute + s/60;h = st.wHour + m/60;p1.x = 0.8*rr*cos(s*6-90)/AG) + mid.x;p1.y = 0.8*rr*sin(s*6-90)/AG) + mid.y;m_memDC.MoveTo(p1.x, p1.y);m_memDC.LineTo(mid.x, mid.y);CRgn rgn1, rgn2;CBrush br(RGB(0, 0, 0);p1.x = 0.8*rr*cos(m*6-90)/AG) + mid.x;p1.y = 0.8*rr*sin(m*6-90)/AG) + mid.y;p3.x = -0.1*rr*cos(m*6-90)/AG) + mid.x;p3.y = -0.1*rr*sin(m*6-90)/AG) + mid.y;p2.x = 0.1*rr*cos(m*6-75)/AG) + mid.x;p2.y = 0.1*rr*sin(m*6-75)/AG) + mid.y;m_memDC.BeginPath();/调用启动一个路径分支,其后的绘图命令自动成为路径的部分m_memDC.MoveTo(p3.x, p3.y);m_memDC.LineTo(p2.x, p2.y);m_memDC.LineTo(p1.x, p1.y);p2.x = 0.1*rr*cos(m*6-105)/AG) + mid.x;p2.y = 0.1*rr*sin(m*6-105)/AG) + mid.y;m_memDC.MoveTo(p3.x, p3.y);m_memDC.LineTo(p2.x, p2.y);m_memDC.LineTo(p1.x, p1.y);m_memDC.EndPath();/结束路径定义,以上所有绘图操作将在新场景中生效rgn1.CreateFromPath(&m_memDC);/创建从中选择到特定设备上下文的路径的区域p1.x = 0.7*rr*cos(h*30-90)/AG) + mid.x;p1.y = 0.7*rr*sin(h*30-90)/AG) + mid.y;p3.x = -0.1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论