版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí) 驗(yàn) 報(bào) 告2015 2016 學(xué)年 第 二 學(xué)期實(shí) 驗(yàn) 課 程 軟件開發(fā)與實(shí)踐學(xué) 生 姓 名*實(shí) 驗(yàn) 項(xiàng) 目時(shí)鐘GUI控件學(xué) 院計(jì)算機(jī)科學(xué)技術(shù)學(xué)院實(shí) 驗(yàn) 性 質(zhì)上機(jī)實(shí)驗(yàn)班 級(jí) 學(xué) 號(hào)*實(shí) 驗(yàn) 地 點(diǎn)研1213同 組 人 數(shù)第 組實(shí) 驗(yàn) 日 期第 周 星期 第 節(jié)成 績(jī)環(huán) 境 參 數(shù)一、 實(shí)驗(yàn)?zāi)康募耙蠖?、?shí)驗(yàn)原理、實(shí)驗(yàn)內(nèi)容三、實(shí)驗(yàn)儀器設(shè)備及材料四、操作方法與實(shí)驗(yàn)步驟五、實(shí)驗(yàn)數(shù)據(jù)記錄及處理六、 實(shí)驗(yàn)結(jié)果分析及討論一、實(shí)驗(yàn)?zāi)康募耙笤O(shè)計(jì)一個(gè)時(shí)鐘GUI控件,控件包括一個(gè)表盤(表盤邊緣上有60條細(xì)刻度線12條出粗刻度線)以及時(shí)分秒針,控件能自動(dòng)讀取當(dāng)前系統(tǒng)時(shí)間,并以時(shí)分秒的形式顯示。控件每秒讀取一
2、次計(jì)算機(jī)系統(tǒng)時(shí)間,并完成時(shí)鐘指針的顯示更新。在GUI應(yīng)用程序中可以利用時(shí)鐘控件創(chuàng)建多個(gè)時(shí)鐘實(shí)例,并顯示在應(yīng)用程序的窗口界面程序設(shè)計(jì)報(bào)告:word文檔,在程序設(shè)計(jì)報(bào)告中需要詳細(xì)的寫出時(shí)鐘控件的設(shè)計(jì)思想,畫出主要的類圖,活動(dòng)圖以及重要子函數(shù)的的程序流程圖,并以附錄的形式給出完整代碼二、 實(shí)驗(yàn)原理、實(shí)驗(yàn)內(nèi)容主要問題: 1.首先想到的是如何繪制指針式的圖形時(shí)鐘,通過查詢資料可知,要在Cwnd基類下創(chuàng)建Windows子窗口,然后從此繼承一個(gè)類,在派生類中實(shí)現(xiàn)消息處理成員函數(shù)和消息映射,以指定當(dāng)消息被發(fā)送到窗口時(shí)應(yīng)該如何動(dòng)作。 2.程序調(diào)試時(shí),出現(xiàn)以下錯(cuò)誤:unresolved external symb
3、ol _endthreadex,錯(cuò)誤現(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.錯(cuò)誤提示為: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)境中進(jìn)行下列操作:“Project”-“settings”-“c/c+”“Catagory” 選擇“Code Generation”“use run-time library”選擇“debug multithreaded”到此處解決一般問題,如果又一下錯(cuò)誤提示:libcmtd.lib(crt0.obj) : error LNK2001: unresolved external通過查詢資料后可知,解決步驟如下;1.在VC+6.0編譯環(huán)境中進(jìn)行下列操作:“Project”-“settings”-“c/c+”“Catagory” 選擇“Code Generation”“use run-time
6、 library”選擇“debug multithreaded”到此處解決一般問題,如果又一下錯(cuò)誤提示:libcmtd.lib(crt0.obj) : error LNK2001: unresolved externalsymbol _mainDebug/Hello.exe : fatal error LNK1120: 1 unresolved externals,則進(jìn)行第2步操作2. Project - Settings - 選擇Link屬性頁(yè),在Project Options中將/subsystem:console改成/subsystem:windows.此時(shí)確定解決一般問題.程序設(shè)計(jì)基本
7、概念和原理MFC窗口類CWnd:在Windows系統(tǒng)里,一個(gè)窗口的屬性分兩個(gè)地方存放:一部分放在“窗口類”里頭,如上所述的在注冊(cè)窗口時(shí)指定;另一部分放在Windows Object本身,如:窗口的尺寸,窗口的位置(X,Y軸),窗口的Z軸順序,窗口的狀態(tài),和其他窗口的關(guān)系,窗口是否可以接收鍵盤或鼠標(biāo)消息,等等。為了表達(dá)所有這些窗口的共性,MFC設(shè)計(jì)了一個(gè)窗口基類CWnd。有一點(diǎn)非常重要,那就是CWnd提供了一個(gè)標(biāo)準(zhǔn)而通用的MFC窗口過程,MFC下所有的窗口都使用這個(gè)窗口過程。至于通用的窗口過程卻能為各個(gè)窗口實(shí)現(xiàn)不同的操作.CFrameWnd類:CFrameWnd類往往用于創(chuàng)建應(yīng)用程序的主窗口,因
8、為它能很好地支持系統(tǒng)菜單和控制條,為此定義了大量的成員函數(shù)和變量。在編寫文檔/視圖結(jié)構(gòu)的應(yīng)用程序時(shí),CFrameWnd作為主窗口管理視圖和文檔對(duì)象。視圖對(duì)象和控制條都成為CFrameWnd的子窗口,它們分享客戶區(qū),其位置被CFrameWnd有效地排列。 CFrameWnd直接支持單文檔界面,對(duì)于多文檔界面,使用其派生類CMDIFrameWnd和CMDIChildWnd.GetLocalTime函數(shù)GetLocalTime是一個(gè)Windows API 函數(shù),用來獲取當(dāng)?shù)氐漠?dāng)前系統(tǒng)日期和時(shí)間.Onpaint:在C+中Onpaint是WM_PAINT消息的消息處理函數(shù),Onpaint()是Cwnd的
9、類成員,負(fù)責(zé)響應(yīng)WM_PAINT.基本原理:本次課程設(shè)計(jì)是基于面向?qū)ο蟮膽?yīng)用程序設(shè)計(jì),主要運(yùn)用C+語言在VC+開發(fā)環(huán)境下的MFC中編程實(shí)現(xiàn)。模擬時(shí)鐘的基本功能是程序初始在屏幕上有一指針式時(shí)鐘表盤,表盤為圓形,內(nèi)部分布有12個(gè)刻度,表盤上有三個(gè)長(zhǎng)度和形狀不同的時(shí)針分針和秒針,相互之間容易辨認(rèn),指針的運(yùn)動(dòng)通過數(shù)學(xué)推導(dǎo)之后以代碼實(shí)現(xiàn),且時(shí)鐘顯示時(shí)間與系統(tǒng)時(shí)間是一致的.三、實(shí)驗(yàn)儀器設(shè)備及材料臺(tái)式機(jī)電腦、Visual C+ 6.0四、操作方法與實(shí)驗(yàn)步驟(1) 繪制指針式的時(shí)鐘和數(shù)字式的時(shí)鐘圖形時(shí),要在CWnd類下進(jìn)行。其中OnPaint()函數(shù)在繪制視圖窗口時(shí)被調(diào)用, 在定義了畫刷CBrush和畫筆CP
10、en之后,調(diào)用GetClientRect()定義屏幕大小并確定橢圓中心的坐標(biāo),然后調(diào)用Ellipse繪制橢圓,即指針式的時(shí)鐘表盤,調(diào)用MoveTo()和LineTo()繪制表盤指針。(2) 模擬時(shí)鐘處理消息的過程:首先調(diào)用SetTimer函數(shù)定義時(shí)鐘消息,包括參數(shù)指定計(jì)時(shí)器的ID,消息產(chǎn)生的時(shí)間間隔,回調(diào)函數(shù)為NULL;調(diào)用消息處理函數(shù)OnTimer()刷新窗口顯示。在相應(yīng)的WM_TIMER消息處理里添加時(shí)鐘消息響應(yīng)代碼;最后調(diào)用KillTimer釋放該時(shí)鐘。(3) 要實(shí)現(xiàn)時(shí)鐘的動(dòng)態(tài)效果,即時(shí)間窗顯示的時(shí)間每隔一秒鐘更新一次,要定時(shí)更新,則應(yīng)利用WM_TIMER消息,計(jì)時(shí)器每隔一定的時(shí)間間隔就
11、會(huì)發(fā)出一個(gè)WM_TIMER消息,而這個(gè)時(shí)間間隔可由用戶指定。MFC的Windows類提供了WM_TIMER消息處理函數(shù)OnTimer(),應(yīng)在該函數(shù)內(nèi)進(jìn)行更新時(shí)間窗格的工作。先利用ClassWazard給CMainFrame類加入WM_TIMER消息處理函數(shù)OnTimer(),CMainFrame: OnTimer()函數(shù)是在系統(tǒng)發(fā)給框架窗口消息WM_TIMER時(shí)調(diào)用的,在CMainFrame:OnCreate()函數(shù)內(nèi)調(diào)用CWnd:SetTimer()以安裝一個(gè)計(jì)時(shí)器,使OnTimer()在設(shè)定的時(shí)間間隔被調(diào)用。(4) 通過調(diào)用GetCurrentTime()函數(shù)來實(shí)現(xiàn)時(shí)鐘時(shí)間與計(jì)算機(jī)系統(tǒng)時(shí)
12、間保持一致.開始流程圖:創(chuàng)建應(yīng)用程序MFC主窗口定義畫筆Cpen和畫刷CBrush定義屏幕大小并確定橢圓中心坐標(biāo)GetClientRect()調(diào)用SetTimer()函數(shù)設(shè)置時(shí)間間隔 獲取當(dāng)前系統(tǒng)時(shí)間GetLocaTime()調(diào)用MoveTo()和LineLineTo()繪制時(shí)鐘中面的指針和刻度調(diào)用消息處理函數(shù)Onpaint()刷新窗口顯示 時(shí)間顯示 退出 程序結(jié)束類圖:五、實(shí)驗(yàn)數(shù)據(jù)記錄及處理獲取系統(tǒng)時(shí)間:SYSTEMTIME st;GetLocalTime(&st);定義時(shí)分秒顯示時(shí)間: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ù),繪制時(shí)鐘鐘面的指針和刻度,使指針按照系統(tǒng)時(shí)間轉(zhuǎn)動(dòng):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繼承一個(gè)MFC窗口基類public:CMyWnd();protected:afx_msg void OnPaint();/聲明消息處理函數(shù)afx_msg void OnSize(UINT uType, int cx, int cy);/聲明函數(shù)Onsize實(shí)現(xiàn)窗口大小更改afx_msg BOOL OnEraseBkgnd(CDC* pDC);/背景處理afx
16、_msg void OnTimer(UINT_PTR nIdEvent);/實(shí)現(xiàn)定時(shí)控制功能afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/窗口生成DECLARE_MESSAGE_MAP()private:CDC m_memDC;/聲明一個(gè)CDC對(duì)象m_memDC;class CMyApp : public CWinApppublic:virtual BOOL InitInstance()/創(chuàng)建模態(tài)對(duì)話框m_pMainWnd = new CMyWnd;m_pMainWnd-ShowWindow(m_nCmdShow);/設(shè)置當(dāng)前窗口顯示
17、狀態(tài)m_pMainWnd-UpdateWindow();/更新區(qū)域?yàn)榭?,不發(fā)送消息到達(dá)當(dāng)前窗口客戶區(qū)m_pMainWnd-SetTimer(10, 1000, NULL);/創(chuàng)建定時(shí)器,設(shè)置時(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ù)指定的等級(jí)類型檢索指定窗口DC環(huán)境this-m_memDC.CreateCompatibleDC(pDC);ReleaseDC(pDC);/函數(shù)釋放DC供其它函數(shù)使用return 0;BOOL CMyWnd:OnEraseBkgnd(CDC* pDC)/擦除背景,為繪圖準(zhǔn)備無效區(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);/替換相同類型對(duì)象tmptmp.DeleteObject();/刪除邏輯畫筆,釋放對(duì)象CBrush brush(RGB(255,255,255);/為畫刷對(duì)象賦初值m_memDC.FillRect(CRect(0, 0, cx, cy),&brush);ReleaseDC(pDC);CMyWnd:CMyWnd()Create(NULL, _T (MFC時(shí)鐘);void CMyWnd:OnTimer(UINT_PTR nIdEvent)Invalidate();/使當(dāng)前整個(gè)窗口無效void CMyWnd:
20、OnPaint()/定義消息處理函數(shù)OnpaintRECT rect;GetClientRect(&rect);/獲取窗口坐標(biāo)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);/將該坐標(biāo)下的像素設(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)前位置連到一個(gè)指定的點(diǎn)。函數(shù)調(diào)用完畢,當(dāng)前位置變成x,ySYSTEMTIME st;G
23、etLocalTime(&st);/獲取當(dāng)前系統(tǒng)時(shí)間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)用啟動(dòng)一個(gè)路徑分支,其后的繪圖命令自動(dòng)成為路徑的部分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é)束路徑定義,以上所有繪圖操作將在新場(chǎng)景中生效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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 脾胃虛弱動(dòng)畫冬病夏治
- 大叔爺爺課件教學(xué)課件
- 2024年分子篩項(xiàng)目投資申請(qǐng)報(bào)告代可行性研究報(bào)告
- 物聯(lián)網(wǎng)畢業(yè)設(shè)計(jì)論文
- 龍蝦的課件教學(xué)課件
- 牙體牙髓病常用藥物
- 2.1.2碳酸鈉和碳酸氫鈉 課件高一上學(xué)期化學(xué)人教版(2019)必修第一冊(cè)
- 糖尿病胰島素注射治療
- 新公司企業(yè)規(guī)劃
- 合唱團(tuán)說課稿
- GB/T 17644-1998紡織纖維白度色度試驗(yàn)方法
- 第五單元寫作《如何突出中心》課件 【新教材備課精研】部編版語文七年級(jí)上冊(cè)
- GB 24500-2020工業(yè)鍋爐能效限定值及能效等級(jí)
- GB 19173-2003桑樹種子和苗木
- 精細(xì)化工概論-05洗滌劑
- 報(bào)聯(lián)商有效溝通課件
- 速賣通介紹課件
- 腦梗死PPT教學(xué)講解課件
- 腦卒中患者語言康復(fù)訓(xùn)練課件
- 古代茶具的演變課件
- 55三相異步電動(dòng)機(jī)的銘牌與型號(hào)電機(jī)與變壓器勞動(dòng)第五版課件
評(píng)論
0/150
提交評(píng)論