软件开发与实践报告.doc

上传人:jian****018 文档编号:8088340 上传时间:2020-03-27 格式:DOC 页数:12 大小:69KB
返回 下载 相关 举报
软件开发与实践报告.doc_第1页
第1页 / 共12页
软件开发与实践报告.doc_第2页
第2页 / 共12页
软件开发与实践报告.doc_第3页
第3页 / 共12页
点击查看更多>>
资源描述
实 验 报 告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*rr*cos(h*30-90)/AG) + mid.x;p3.y = -0.1*rr*sin(h*30-90)/AG) + mid.y;p2.x = 0.1*rr*cos(h*30-60)/AG) + mid.x;p2.y = 0.1*rr*sin(h*30-60)/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(h*30-120)/AG) + mid.x;p2.y = 0.1*rr*sin(h*30-120)/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();rgn2.CreateFromPath(&m_memDC);rgn2.CombineRgn(&rgn1, &rgn2, RGN_OR);/合并两区域m_memDC.FillRgn(&rgn2, &br);/用刷子填充指定区域#pragma warning(pop)CPaintDC(this).BitBlt(rect.left, rect.top, rect.right, rect.bottom, &m_memDC, 0, 0, SRCCOPY); 六、实验结果分析及讨论本程序利用GUI控件,实现了边缘上有60条细刻度线12条出粗刻度线的表盘控件,并能够自动读取当前系统时间,以时分秒的形式显示,从而完成时钟指针的显示更新。在程序中还可以利用该时钟控件创建多个时钟实例,并可显示在应用程序的窗口界面。仪器设备损坏、非正常损耗材料(试剂)及处理情况:教师对报告的最终评价及处理意见: 教 师 签 字: 年 月 日
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!