軟件開發(fā)與實踐報告_第1頁
軟件開發(fā)與實踐報告_第2頁
軟件開發(fā)與實踐報告_第3頁
軟件開發(fā)與實踐報告_第4頁
軟件開發(fā)與實踐報告_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、實 驗 報 告2015 2016 學(xué)年 第 二 學(xué)期實 驗 課 程 軟件開發(fā)與實踐學(xué) 生 姓 名*實 驗 項 目時鐘GUI控件學(xué) 院計算機科學(xué)技術(shù)學(xué)院實 驗 性 質(zhì)上機實驗班 級 學(xué) 號*實 驗 地 點研1213同 組 人 數(shù)第 組實 驗 日 期第 周 星期 第 節(jié)成 績環(huán) 境 參 數(shù)一、 實驗?zāi)康募耙蠖?、實驗原理、實驗?nèi)容三、實驗儀器設(shè)備及材料四、操作方法與實驗步驟五、實驗數(shù)據(jù)記錄及處理六、 實驗結(jié)果分析及討論一、實驗?zāi)康募耙笤O(shè)計一個時鐘GUI控件,控件包括一個表盤(表盤邊緣上有60條細刻度線12條出粗刻度線)以及時分秒針,控件能自動讀取當(dāng)前系統(tǒng)時間,并以時分秒的形式顯示??丶棵胱x取一

2、次計算機系統(tǒng)時間,并完成時鐘指針的顯示更新。在GUI應(yīng)用程序中可以利用時鐘控件創(chuàng)建多個時鐘實例,并顯示在應(yīng)用程序的窗口界面程序設(shè)計報告:word文檔,在程序設(shè)計報告中需要詳細的寫出時鐘控件的設(shè)計思想,畫出主要的類圖,活動圖以及重要子函數(shù)的的程序流程圖,并以附錄的形式給出完整代碼二、 實驗原理、實驗內(nèi)容主要問題: 1.首先想到的是如何繪制指針式的圖形時鐘,通過查詢資料可知,要在Cwnd基類下創(chuàng)建Windows子窗口,然后從此繼承一個類,在派生類中實現(xiàn)消息處理成員函數(shù)和消息映射,以指定當(dāng)消息被發(fā)送到窗口時應(yīng)該如何動作。 2.程序調(diào)試時,出現(xiàn)以下錯誤:unresolved external symb

3、ol _endthreadex,錯誤現(xiàn)象具體為: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.o

4、bj) : 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

5、編譯環(huán)境中進行下列操作:“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編譯環(huán)境中進行下列操作:“Project”-“settings”-“c/c+”“Catagory” 選擇“Code Generation”“use run-time

6、 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.此時確定解決一般問題.程序設(shè)計基本

7、概念和原理MFC窗口類CWnd:在Windows系統(tǒng)里,一個窗口的屬性分兩個地方存放:一部分放在“窗口類”里頭,如上所述的在注冊窗口時指定;另一部分放在Windows Object本身,如:窗口的尺寸,窗口的位置(X,Y軸),窗口的Z軸順序,窗口的狀態(tài),和其他窗口的關(guān)系,窗口是否可以接收鍵盤或鼠標消息,等等。為了表達所有這些窗口的共性,MFC設(shè)計了一個窗口基類CWnd。有一點非常重要,那就是CWnd提供了一個標準而通用的MFC窗口過程,MFC下所有的窗口都使用這個窗口過程。至于通用的窗口過程卻能為各個窗口實現(xiàn)不同的操作.CFrameWnd類:CFrameWnd類往往用于創(chuàng)建應(yīng)用程序的主窗口,因

8、為它能很好地支持系統(tǒng)菜單和控制條,為此定義了大量的成員函數(shù)和變量。在編寫文檔/視圖結(jié)構(gòu)的應(yīng)用程序時,CFrameWnd作為主窗口管理視圖和文檔對象。視圖對象和控制條都成為CFrameWnd的子窗口,它們分享客戶區(qū),其位置被CFrameWnd有效地排列。 CFrameWnd直接支持單文檔界面,對于多文檔界面,使用其派生類CMDIFrameWnd和CMDIChildWnd.GetLocalTime函數(shù)GetLocalTime是一個Windows API 函數(shù),用來獲取當(dāng)?shù)氐漠?dāng)前系統(tǒng)日期和時間.Onpaint:在C+中Onpaint是WM_PAINT消息的消息處理函數(shù),Onpaint()是Cwnd的

9、類成員,負責(zé)響應(yīng)WM_PAINT.基本原理:本次課程設(shè)計是基于面向?qū)ο蟮膽?yīng)用程序設(shè)計,主要運用C+語言在VC+開發(fā)環(huán)境下的MFC中編程實現(xiàn)。模擬時鐘的基本功能是程序初始在屏幕上有一指針式時鐘表盤,表盤為圓形,內(nèi)部分布有12個刻度,表盤上有三個長度和形狀不同的時針分針和秒針,相互之間容易辨認,指針的運動通過數(shù)學(xué)推導(dǎo)之后以代碼實現(xiàn),且時鐘顯示時間與系統(tǒng)時間是一致的.三、實驗儀器設(shè)備及材料臺式機電腦、Visual C+ 6.0四、操作方法與實驗步驟(1) 繪制指針式的時鐘和數(shù)字式的時鐘圖形時,要在CWnd類下進行。其中OnPaint()函數(shù)在繪制視圖窗口時被調(diào)用, 在定義了畫刷CBrush和畫筆CP

10、en之后,調(diào)用GetClientRect()定義屏幕大小并確定橢圓中心的坐標,然后調(diào)用Ellipse繪制橢圓,即指針式的時鐘表盤,調(diào)用MoveTo()和LineTo()繪制表盤指針。(2) 模擬時鐘處理消息的過程:首先調(diào)用SetTimer函數(shù)定義時鐘消息,包括參數(shù)指定計時器的ID,消息產(chǎn)生的時間間隔,回調(diào)函數(shù)為NULL;調(diào)用消息處理函數(shù)OnTimer()刷新窗口顯示。在相應(yīng)的WM_TIMER消息處理里添加時鐘消息響應(yīng)代碼;最后調(diào)用KillTimer釋放該時鐘。(3) 要實現(xiàn)時鐘的動態(tài)效果,即時間窗顯示的時間每隔一秒鐘更新一次,要定時更新,則應(yīng)利用WM_TIMER消息,計時器每隔一定的時間間隔就

11、會發(fā)出一個WM_TIMER消息,而這個時間間隔可由用戶指定。MFC的Windows類提供了WM_TIMER消息處理函數(shù)OnTimer(),應(yīng)在該函數(shù)內(nèi)進行更新時間窗格的工作。先利用ClassWazard給CMainFrame類加入WM_TIMER消息處理函數(shù)OnTimer(),CMainFrame: OnTimer()函數(shù)是在系統(tǒng)發(fā)給框架窗口消息WM_TIMER時調(diào)用的,在CMainFrame:OnCreate()函數(shù)內(nèi)調(diào)用CWnd:SetTimer()以安裝一個計時器,使OnTimer()在設(shè)定的時間間隔被調(diào)用。(4) 通過調(diào)用GetCurrentTime()函數(shù)來實現(xiàn)時鐘時間與計算機系統(tǒng)時

12、間保持一致.開始流程圖:創(chuàng)建應(yīng)用程序MFC主窗口定義畫筆Cpen和畫刷CBrush定義屏幕大小并確定橢圓中心坐標GetClientRect()調(diào)用SetTimer()函數(shù)設(shè)置時間間隔 獲取當(dāng)前系統(tǒng)時間GetLocaTime()調(diào)用MoveTo()和LineLineTo()繪制時鐘中面的指針和刻度調(diào)用消息處理函數(shù)Onpaint()刷新窗口顯示 時間顯示 退出 程序結(jié)束類圖:五、實驗數(shù)據(jù)記錄及處理獲取系統(tǒng)時間:SYSTEMTIME st;GetLocalTime(&st);定義時分秒顯示時間:double h, m, s;s = st.wSecond;m = st.wMinute + s/60;h

13、 = st.wHour + m/60;定義消息處理函數(shù):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.bot

14、tom - rect.right) / 2;r = rect.right;b = rect.right + t;rr = r/2;調(diào)用MoveTo()和LineTo()函數(shù),繪制時鐘鐘面的指針和刻度,使指針按照系統(tǒng)時間轉(zhuǎn)動: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) +

15、 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();/聲明消息處理函數(shù)afx_msg void OnSize(UINT uType, int cx, int cy);/聲明函數(shù)Onsize實現(xiàn)窗口大小更改afx_msg BOOL OnEraseBkgnd(CDC* pDC);/背景處理afx

16、_msg void OnTimer(UINT_PTR nIdEvent);/實現(xiàn)定時控制功能afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/窗口生成DECLARE_MESSAGE_MAP()private:CDC m_memDC;/聲明一個CDC對象m_memDC;class CMyApp : public CWinApppublic:virtual BOOL InitInstance()/創(chuàng)建模態(tài)對話框m_pMainWnd = new CMyWnd;m_pMainWnd-ShowWindow(m_nCmdShow);/設(shè)置當(dāng)前窗口顯示

17、狀態(tài)m_pMainWnd-UpdateWindow();/更新區(qū)域為空,不發(fā)送消息到達當(dāng)前窗口客戶區(qū)m_pMainWnd-SetTimer(10, 1000, NULL);/創(chuàng)建定時器,設(shè)置時間間隔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

18、 * pDC = GetDC();/根據(jù)指定的等級類型檢索指定窗口DC環(huán)境this-m_memDC.CreateCompatibleDC(pDC);ReleaseDC(pDC);/函數(shù)釋放DC供其它函數(shù)使用return 0;BOOL CMyWnd:OnEraseBkgnd(CDC* pDC)/擦除背景,為繪圖準備無效區(qū)域return TRUE;void CMyWnd:OnSize(UINT uType, int cx, int cy)/定義窗口更改函數(shù)OnsizeCBitmap tmp;CDC * pDC = GetDC();tmp.CreateCompatibleBitmap(pDC, cx

19、, cy);/創(chuàng)建與指定設(shè)備相關(guān)的位圖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();/使當(dāng)前整個窗口無效void CMyWnd:

20、OnPaint()/定義消息處理函數(shù)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)

21、 / 2;r = rect.right;b = rect.right + t;rr = r/2;m_memDC.Ellipse(l, t, r, b);/調(diào)用橢圓函數(shù)m_memDC.SetPixel(mid.x, mid.y, RGB(0, 0, 0);/將該坐標下的像素設(shè)為指定顏色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 3

22、60; 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);/用當(dāng)前畫筆畫一條線,從當(dāng)前位置連到一個指定的點。函數(shù)調(diào)用完畢,當(dāng)前位置變成x,ySYSTEMTIME st;G

23、etLocalTime(&st);/獲取當(dāng)前系統(tǒng)時間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) +

24、 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();/調(diào)用啟動一個路徑分支,其后的繪圖命令自動成為路徑的部分m_memDC.MoveTo(p3.x, p3.y);m_memDC.LineTo(p2.x, p2.y)

25、;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();/結(jié)束路徑定義,以上所有繪圖操作將在新場景中生效rgn1.CreateFromPath(&m_memDC);/創(chuàng)建從中選擇到特定設(shè)備上下文的路徑的區(qū)域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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論