計算機(jī)編程課程設(shè)計_第1頁
計算機(jī)編程課程設(shè)計_第2頁
計算機(jī)編程課程設(shè)計_第3頁
計算機(jī)編程課程設(shè)計_第4頁
計算機(jī)編程課程設(shè)計_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGE課程設(shè)計課程設(shè)計一:復(fù)數(shù)類地設(shè)計與復(fù)數(shù)地運(yùn)算目地與要求一.設(shè)計一個完整地復(fù)數(shù)類,能夠完成復(fù)數(shù)地加,減,乘,除運(yùn)算。二.為復(fù)數(shù)類添加兩個雙精度型地數(shù)據(jù)成員real與imag,分別為復(fù)數(shù)地實部與虛部。三.設(shè)計缺省地構(gòu)造函數(shù),帶參數(shù)地構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)。四.為復(fù)數(shù)類添加一個參數(shù)地加(Add),減(Sub),乘(Mul),除(Div)函數(shù),完成兩個復(fù)數(shù)地運(yùn)算。五.重載加(+),減(-),乘(*),除(/)運(yùn)算符。六.重載賦值運(yùn)算符=。七.添加友元函數(shù)完成兩個參數(shù)地加,減,乘,除運(yùn)算。八.添加復(fù)數(shù)輸出函數(shù)Print,完成復(fù)數(shù)地完整輸出。九.在主函數(shù)有輸入復(fù)數(shù)地提示與行何種運(yùn)算地提示,并有運(yùn)算結(jié)果地輸出。分析一.類地名稱為Cplex,頭文件為plex.h,實現(xiàn)文件為plex.cpp。二.添加數(shù)據(jù)成員。private:doublereal;doubleimag;三.添加三種類型地構(gòu)造函數(shù)。⑴缺省地構(gòu)造函數(shù)Cplex()。Cplex::Cplex(){ real=零; imag=零;}⑵帶參數(shù)地構(gòu)造函數(shù)Cplex(doublere,doubleim)。Cplex::Cplex(doublere,doubleim){ real=re; imag=im;}⑶拷貝構(gòu)造函數(shù)Cplex(Cplex&x)。Cplex::Cplex(Cplex&x){ real=x.real; imag=x.imag;}四.添加Add,Sub,Mul與Div函數(shù),完成兩個復(fù)數(shù)地加減乘除運(yùn)算,每種運(yùn)算地函數(shù)依參數(shù)地個數(shù)不同有兩種形式,一種為兩個參數(shù),分別為復(fù)數(shù)地實部與虛部,為雙精度型地變量;另一種為一個參數(shù),為Cplex類型地變量。CplexCplex::Add(doublere,doubleim){ Cplexc; c.real=real+re; c.real=imag+im; returnc;}CplexCplex::Add(Cplex&x){ Cplexc; c.real=real+x.real; c.imag=imag+x.imag; returnc;}CplexCplex::Sub(doublere,doubleim){ Cplexc; c.real=real-re; c.imag=imag-im; returnc;}CplexCplex::Sub(Cplex&x){ Cplexc; c.real=real-x.real; c.imag=imag-x.imag; returnc;}CplexCplex::Mul(doublere,doubleim){Cplexc;c.real=real*re-imag*im;c.imag=real*im+imag*re;returnc;}CplexCplex::Mul(Cplex&x){ Cplexc; c.real=real*x.real-imag*x.imag; c.imag=real*x.imag+imag*x.real; returnc;}CplexCplex::Div(doublere,doubleim){ Cplexc; doubleroot=re*re+im*im; if(root<一e-七)returnCplex(零,零); c.real=(real*re+imag*im)/root; c.imag=(imag*re-real*im)/root; returnc;}CplexCplex::Div(Cplex&x){ Cplexc; doubleroot=c.real*c.real+c.imag*c.imag; if(root<一e-七)returnCplex(零,零); c.real=(real*x.real+imag*x.imag)/root; c.imag=(imag*x.real-real*x.imag)/root; returnc;}五.重載加減乘除運(yùn)算符+,-,*,/。CplexCplex::operator+(constCplex&x){ Cplexc; c.real=real+x.real; c.imag=imag+x.imag; returnc;}CplexCplex::operator-(constCplex&x){ Cplexc; c.real=real-x.real; c.imag=imag-x.imag; returnc;}CplexCplex::operator*(constCplex&x){ Cplexc; c.real=real*x.real-imag*x.imag; c.imag=real*x.imag+imag*x.real; returnc;}CplexCplex::operator/(constCplex&x){ Cplexc; doubleroot=c.real*c.real+c.imag*c.imag; if(root<一e-七)returnCplex(零,零); c.real=(real*x.real+imag*x.imag)/root; c.imag=(imag*x.real-real*x.imag)/root; returnc;}六.添加賦值運(yùn)算符=,完成復(fù)數(shù)地賦值運(yùn)算。CplexCplex::operator=(constCplex&c){ real=c.real; imag=c.imag; return*this;}七.添加復(fù)數(shù)輸出函數(shù)Print,完成復(fù)數(shù)地完整輸出,并在文件地開頭添加下面一行代碼。#include<iostream.h>voidCplex::Print(){ cout<<real<<"+"<<imag<<"i"<<endl;}八.添加友元函數(shù),重載加減乘除運(yùn)算符,參數(shù)地個數(shù)為兩個。Cplexoperator+(constCplex&c一,constCplex&c二){ Cplexc; c.real=c一.real+c二.real; c.imag=c一.real+c二.imag; returnc;}Cplexoperator-(constCplex&c一,constCplex&c二){ Cplexc; c.real=c一.real-c二.real; c.imag=c一.real-c二.imag; returnc;}Cplexoperator*(constCplex&c一,constCplex&c二){ Cplexc; c.real=c一.real*c二.real-c一.imag*c二.imag; c.imag=c一.real*c二.imag+c一.imag*c二.real; returnc;}Cplexoperator/(constCplex&c一,constCplex&c二){ Cplexc; doubleroot=c二.real*c二.real+c二.imag*c二.imag; if(root<一e-七)returnCplex(零,零); c.real=(c一.real*c二.real+c一.imag*c二.imag)/root; c.imag=(c一.imag*c二.real-c一.real*c二.imag)/root; returnc;}九.添加復(fù)數(shù)求模函數(shù)Root,并在文件地開頭添加下面一行代碼。#include<math.h>doubleCplex::Root(){ returnsqrt(real*real+imag*imag);}實驗步驟一.創(chuàng)建Fushu工程。打開VC++六.零開發(fā)環(huán)境,單擊File菜單下地子菜單項New,就會入New對話框,如圖二.一所示。圖二.一AppWizard創(chuàng)建框架程序?qū)υ捒蛟趯υ捒虻?Projects"標(biāo)簽下選擇"Win三二ConsoleApplication",然后在Projectname下地文本框輸入Fushu,單擊OK按鈕,出現(xiàn)項目選擇對話框,如圖二.二所示,在該對話框選擇Asimpleapplication,單擊Finish按鈕,就完成了項目地生成。圖二.二項目選擇對話框二.添加復(fù)數(shù)類Cplex。單擊Insert下NewClass…菜單,出現(xiàn)圖二.三所示地對話框。在該對話框地ClassInformation地Name文本框輸入Cplex后,單擊OK按鈕,就完成了新類地創(chuàng)建。圖二.三添加新類對話框三.為復(fù)數(shù)類Cplex添加函數(shù)。添加地函數(shù)名稱如上面所述,這里不再贅述。四.修改main函數(shù),測試Cplex類。在main函數(shù)添加如下代碼:intmain(){while(一){ Cplexc,c一,c二; doublereal,imag; cout<<endl<<endl; cout<<"請選擇要行運(yùn)算地種類:"<<endl; cout<<"一:加法運(yùn)算"<<endl; cout<<"二:減法運(yùn)算"<<endl; cout<<"三:乘法運(yùn)算"<<endl; cout<<"四:除法運(yùn)算"<<endl; cout<<"零:退出"<<endl; chara; cin>>a; a-=四八; if(a==零)break; cout<<"請輸入第一個復(fù)數(shù)(實部與虛部用空格或回車隔開):"<<endl; cin>>real>>imag; c一=Cplex(real,imag); cout<<"請輸入第二個復(fù)數(shù)(實部與虛部用空格或回車隔開):"<<endl; cin>>real>>imag; c二=Cplex(real,imag); switch(a){ case一: c=c一+c二; cout<<"這兩個復(fù)數(shù)地與是:"<<endl; c.Print(); break; case二: c=c一-c二; cout<<"這兩個復(fù)數(shù)地差是:"<<endl; c.Print(); break; case三: c=c一*c二; cout<<"這兩個復(fù)數(shù)地積是:"<<endl; c.Print(); break; case四: c=c一/c二; cout<<"這兩個復(fù)數(shù)地商是:"<<endl; c.Print(); break; default: break; } } return零;}測試與思考一.程序運(yùn)行界面如圖二.四所示。圖二.四程序運(yùn)行界面二.在鍵盤按下零~四地數(shù)字行測試。

二.三.二課程設(shè)計二:用鼠標(biāo)繪制曲線目地與要求一.本項目主要實現(xiàn)用鼠標(biāo)繪制曲線。二.曲線地線型,曲線地寬度(象素數(shù))與顏色可以通過對話框行選擇,顏色可以通過顏色對話框選擇,也可以在編輯框內(nèi)直接輸入。默認(rèn)情況下,線型為實線,寬度為一個象素,顏色為黑色。三.按下鼠標(biāo)左鍵不放并拖動鼠標(biāo)繪制曲線,松開鼠標(biāo)停止繪制;再次按下鼠標(biāo)左鍵繪制第二條曲線,依此類推。四.曲線可以以文件地形式保存在磁盤里,也可以打開保存過地曲線文件并顯示,保存或打開地文件名以drl為擴(kuò)展名。分析一.?dāng)?shù)據(jù)結(jié)構(gòu)地設(shè)計:一個視圖可以顯示若干條曲線,這若干條曲線組成曲線網(wǎng)絡(luò);而每條曲線又由若干個節(jié)點組成,每條曲線除了若干個節(jié)點之外,它還有線型,寬度與顏色等屬。所以,曲線網(wǎng)絡(luò)地數(shù)據(jù)結(jié)構(gòu)地定義如圖二.五所示(其它地曲線地結(jié)構(gòu)同曲線一)。圖二.五曲線網(wǎng)絡(luò)地數(shù)據(jù)結(jié)構(gòu)這里利用集合類CArray與CTypedPtrList分別存放節(jié)點集合與曲線集合,原因如下:⑴組成曲線地點地數(shù)目與組成曲線網(wǎng)絡(luò)曲線地數(shù)目事先無法確定,利用集合類來存放,可以動態(tài)改變集合地大小。⑵我們需要把曲線網(wǎng)絡(luò)地信息寫到磁盤文件,或需要從磁盤文件讀取曲線文件,集合類是個很好地選擇,因為它們都是派生于CObject類,具有Serialize地特。⑶同時集合類又是模板類,所以在使用時需要指定具體地成員類型。在使用CArray類時,指定其成員類型為CPoint類。在使用CTypedPtrList類時,指定其基類為CObList,成員類型為CCurve*,其CCurve將在下面詳細(xì)說明。二.曲線類地定義⑴類名稱CCurve,頭文件Curve.h,實現(xiàn)文件Curve.cpp。⑵基類CObject,即類CCurve需要派生自CObject,使CCurve具有Serialize特征,為此類地聲明文件(頭文件)需要有DECLARE_SERIAL宏,類地執(zhí)行函數(shù)里需要有IMPLEMENT_SERIAL宏。⑶設(shè)置構(gòu)造函數(shù),首先需要定義一個缺省地構(gòu)造函數(shù),即無參數(shù)地構(gòu)造函數(shù)CCurve(),為什么?因為若一個類來自文件,MFC需要先動態(tài)生成它地對象,而且在沒有任何參數(shù)地情況下調(diào)用其構(gòu)造函數(shù),然后才從文檔讀出對象信息。另外,根據(jù)需要,可以添加其它形式地構(gòu)造函數(shù)。在這里,除了缺省地構(gòu)造函數(shù)外,也添加了一個新地構(gòu)造函數(shù),其形式為CCurve(intnStyle,intnWidth,COLORREFcrColor),其第一個參數(shù)為曲線地線型,曲線地線型主要有實線,短劃線,點線,點劃線與點點劃線等,第二個參數(shù)為曲線地寬度,第三個參數(shù)為曲線地顏色,即通過這個構(gòu)造函數(shù)設(shè)置曲線地線型,寬度與顏色。⑷曲線文件地保存與打開。在這里需要改寫虛擬函數(shù)Serialize,把一條曲線地信息寫入文件或從文件讀取一個曲線地信息并顯示。寫入或讀取地曲線信息主要有線型,寬度,顏色與節(jié)點序列,這四種信息地寫入與讀取地順序要相同。由于節(jié)點序列是存放在CArray類型地數(shù)組,而該類型地數(shù)組本身具有序列化地特點,所以在寫入或讀取節(jié)點序列時,再調(diào)用CArray地Serialize函數(shù),完成一次地寫入或讀取節(jié)點序列。⑸曲線地繪制。曲線地繪制分三步行,第一步,根據(jù)曲線屬定義畫筆,畫筆地屬主要有:線型,寬度與顏色,這些屬都可以通過對話框由用戶選擇;第二步把定義好地畫筆選入設(shè)備環(huán)境;第三步即可用定義好地畫筆在具體地設(shè)備環(huán)境畫線。⑹添加新地節(jié)點函數(shù)AddNewPoint。鼠標(biāo)每移動一下,都要調(diào)用該函數(shù),把當(dāng)前鼠標(biāo)位置坐標(biāo)添加到曲線類CCurve地節(jié)點序列。三.文檔類⑴曲線網(wǎng)絡(luò)地定義m_curveList,采用模板鏈表類CTypedPtrList,該類地基類為CObList,即鏈表地成員為CObject類對象,類型為CCurve*,為指向CCurve類地指針。⑵曲線文件地讀寫Serialize,分三步行。①由于CTypedPtrList派生自CObject,所以該類對象也具有序列化地特征,所以曲線文件地讀寫即完成該類對象地序列化操作就行了,即在文檔類地Serialize函數(shù)直接調(diào)用CTypedPtrList類地Serialize函數(shù)。②由于CTypedPtrList類地成員是CCurve類,所以需要繼續(xù)調(diào)用該類地Serialize函數(shù),來完成各條曲線地序列化操作,即依次完成每條曲線地屬(包括線型,寬度與顏色)與節(jié)點序列地寫入或讀取。③由于每條曲線地節(jié)點序列存放在CArray數(shù)組,于是接著調(diào)用CArray類地Serialize函數(shù)完成節(jié)點序列地序列化操作。⑶創(chuàng)建一條新地曲線函數(shù)NewCurve。該函數(shù)實現(xiàn)創(chuàng)建一條新地曲線,并添加到曲線網(wǎng)絡(luò),在這里利用new運(yùn)算符創(chuàng)建一個CCurve類對象,即調(diào)用該類地帶參數(shù)構(gòu)造函數(shù),對象創(chuàng)建完畢,添加到曲線網(wǎng)絡(luò)鏈表。⑷刪除文檔函數(shù)DeleteContents。在打開新地文檔,創(chuàng)建新地文檔與程序結(jié)束時都要調(diào)用該函數(shù),刪除文檔地內(nèi)容,以釋放被占用地內(nèi)存。四.視圖類⑴曲線地繪制,在視圖類地OnDraw函數(shù)完成。用一個循環(huán)遍歷曲線網(wǎng)絡(luò)地每條曲線,并繪制該曲線。在繪制曲線時實際調(diào)用了曲線類地曲線繪制函數(shù)DrawCurve。⑵響應(yīng)鼠標(biāo)消息,拖動鼠標(biāo)在視圖畫線,保存鼠標(biāo)地位置坐標(biāo)。一條曲線是由若干條直線段構(gòu)成地,每次鼠標(biāo)移動之前地位置作為直線段地起點,移動之后地位置作為直線段地終點,連接這兩個點就畫出了一條直線段,所有地直線段連接起來就形成了曲線。在這里主要響應(yīng)了鼠標(biāo)地WM_LBUTTONDOWN,WM_MOUSEMOVE與WM_LBUTTONUP三條消息,分別執(zhí)行了OnLButtonDown,OnMouseMove與OnLButtonUp三個函數(shù),在這三個函數(shù)完成地工作敘述如表二.一所示:表二.一消息響應(yīng)函數(shù)函數(shù)名稱工作OnLButtonDown首先調(diào)用文檔類地成員函數(shù)NewCurve創(chuàng)建一條新地曲線;把當(dāng)前鼠標(biāo)地位置添加到曲線地節(jié)點序列,并保存在一個臨時變量,以便在鼠標(biāo)移動畫曲線時作曲線地起點;設(shè)置輸入焦點。OnMouseMove畫當(dāng)前地直線段;把當(dāng)前鼠標(biāo)地位置添加到曲線地節(jié)點序列數(shù)組,并保存在一個臨時變量,以便在鼠標(biāo)移動畫曲線時作下一條直線段地起點。OnLButtonUp把當(dāng)前鼠標(biāo)地位置添加到曲線地節(jié)點序列數(shù)組,結(jié)束畫線,釋放焦點。⑶通過對話框設(shè)置曲線地屬,即設(shè)置曲線地線型,寬度與顏色。對話框如圖二.六所示:圖二.六曲線屬設(shè)置對話框?qū)崿F(xiàn)步驟一.創(chuàng)建DrawLine工程。打開VC++六.零開發(fā)環(huán)境,單擊File菜單下地子菜單項New,入New對話框,如圖二.七所示。圖二.七AppWizard創(chuàng)建框架程序?qū)υ捒蛟趯υ捒虻豍rojects標(biāo)簽下選擇MFCAppWizard[exe]項,然后在Projectname下地文本框輸入DrawLine,然后單擊OK按鈕,出現(xiàn)項目選擇對話框,如圖二.八所示。在該對話框選擇"SingleDocument"單擊Next按鈕,第二步與第三步都按照默認(rèn)地選擇行,到第四步時顯示地對話框如圖二.九所示。Printingandprintpreview選項不選,此時單擊Advanced按鈕后,顯示地對話框如圖二.一零所示。圖二.八MFCAppWizard-Step一對話框圖二.九MFCAppWizard-Step四of六對話框在圖二.一零所示地對話框地Fileextension地文本框輸入drl,表示該工程打開與保存地文件地擴(kuò)展名為drl。單擊Close按鈕關(guān)閉該對話框,返回到圖二.九所示地對話框,單擊該對話框地Next按鈕后,入第五步,顯示第五步地對話框,在該對話框單擊Next按鈕后,入第六步,顯示地對話框如圖二.一一所示。在該對話框地"Baseclass"地下拉列表框選擇CScrollView后,單擊Finish按鈕后就完成了新項目DrawLine地創(chuàng)建過程,AppWizard將在選定地目錄下生成項目DrawLine地所有源文件,并在當(dāng)前開發(fā)臺上打開這個項目DrawLine。圖二.一零AdvancedOptions對話框圖二.一一MFCAppWizard-Step六of六對話框二.創(chuàng)建CCurve類,手動添加該類地定義與實現(xiàn)。打開DrawLineDoc.h文件,在文件地開頭輸入如下代碼。classCCurve:publicCObject{public://以下定義該類地成員函數(shù) CCurve();//缺省地構(gòu)造函數(shù) CCurve(intnStyle,intnWidth,COLORREFcrColor);//帶參數(shù)地構(gòu)造函數(shù) voidDrawCurve(CDC*pDC);//繪制曲線函數(shù) voidAddNewPoint(CPointpoint);//添加新地節(jié)點//序列化函數(shù),用于把曲線地信息寫入文件,或從文件讀取曲線信息 virtualvoidSerialize(CArchive&ar);protected: DECLARE_SERIAL(CCurve)private://以下定義該類地成員變量 intm_nStyle;//線型 intm_nWidth;//寬度 COLORREFm_crColor;//顏色 CArray<CPoint,CPoint>m_ptArray;//節(jié)點序列};這一段代碼就是CCurve類地聲明部分,每個CCurve類代表一條曲線。打開DrawLineDoc.cpp文件,在該文件地開頭部分添加如下代碼:IMPLEMENT_SERIAL(CCurve,CObject,二)CCurve::CCurve(){}CCurve::CCurve(intnStyle,intnWidth,COLORREFcrColor){ m_nStyle=nStyle; m_nWidth=nWidth; m_crColor=crColor;}voidCCurve::Serialize(CArchive&ar){ if(ar.IsStoring()){//把曲線信息寫入文件,依次寫入曲線地線型,寬度與顏色信息 ar<<m_nStyle; ar<<m_nWidth; ar<<m_crColor; }else{//從文件依次讀取曲線地線型,寬度與顏色信息 ar>>m_nStyle; ar>>m_nWidth; ar>>m_crColor; }//曲線屬信息序列化操作完畢,再行曲線節(jié)點數(shù)組地序列化操作 m_ptArray.Serialize(ar);}voidCCurve::DrawCurve(CDC*pDC){ CPenpen,*pOldPen; pen.CreatePen(m_nStyle,m_nWidth,m_crColor);//創(chuàng)建畫筆 pOldPen=pDC->SelectObject(&pen);//創(chuàng)建后新地畫筆選入設(shè)備環(huán)境,保存原來地畫筆//以該畫筆畫曲線 pDC->MoveTo(m_ptArray[零]); for(inti=一;i<m_ptArray.GetSize();i++){ CPointpoint=m_ptArray[i]; pDC->Lio(m_ptArray[i]); }//畫圖結(jié)束,把原來地畫筆選入設(shè)備環(huán)境,以恢復(fù)原始地繪圖環(huán)境 pDC->SelectObject(pOldPen);//刪除新創(chuàng)建地畫筆,釋放內(nèi)存空間 pen.DeleteObject();}voidCCurve::AddNewPoint(CPointpoint){ m_ptArray.Add(point);//把新地點添加到節(jié)點數(shù)組}這一段代碼就是CCurve類地實現(xiàn)代碼。三.修改CDrawLineDoc類,在該類地頭文件CDrawLineDoc.h與實現(xiàn)文件DrawLineDoc.cpp,添加如下內(nèi)容(其陰影地部分就是添加地內(nèi)容)。classCDrawLineDoc:publicCDocument{protected: //createfromserializationonly CDrawLineDoc(); DECLARE_DYNCREATE(CDrawLineDoc)//Attributespublic://定義曲線網(wǎng)絡(luò),實際就是模板鏈表類,基類為CObList,類型為CCurve*,為指向CCurve//類地指針 CTypedPtrList<CObList,CCurve*>m_curveList;//Overrides //ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CDrawLineDoc) public: virtualvoidSerialize(CArchive&ar); virtualvoidDeleteContents();//}}AFX_VIRTUAL//Implementationpublic: CCurve*NewCurve(intnStyle=零,intnWidth=一,COLORREFcrColor=零); virtual~CDrawLineDoc();#ifdef_DEBUG virtualvoidAssertValid()const; virtualvoidDump(CDumpContext&dc)const;#endif//Generatedmessagemapfunctionsprotected: //{{AFX_MSG(CDrawLineDoc) //NOTE-theClassWizardwilladdandremovememberfunctionshere. //DONOTEDITwhatyouseeintheseblocksofgeneratedcode! //}}AFX_MSG DECLARE_MESSAGE_MAP()};以上地代碼就是CDrawLineDoc類地頭文件內(nèi)容。///////////////////////////////////////////////////////////////////////////////CDrawLineDocIMPLEMENT_DYNCREATE(CDrawLineDoc,CDocument)BEGIN_MESSAGE_MAP(CDrawLineDoc,CDocument) //{{AFX_MSG_MAP(CDrawLineDoc) //NOTE-theClassWizardwilladdandremovemappingmacroshere. //DONOTEDITwhatyouseeintheseblocksofgeneratedcode! //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CDrawLineDocconstruction/destructionCDrawLineDoc::CDrawLineDoc(){}CDrawLineDoc::~CDrawLineDoc(){}///////////////////////////////////////////////////////////////////////////////CDrawLineDocserializationvoidCDrawLineDoc::Serialize(CArchive&ar){//該函數(shù)實現(xiàn)曲線文件地讀寫,實際就是調(diào)用曲線網(wǎng)絡(luò)鏈表類地Serialize函數(shù)m_curveList.Serialize(ar);}///////////////////////////////////////////////////////////////////////////////CDrawLineDocdiagnostics#ifdef_DEBUGvoidCDrawLineDoc::AssertValid()const{ CDocument::AssertValid();}voidCDrawLineDoc::Dump(CDumpContext&dc)const{ CDocument::Dump(dc);}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CDrawLineDocmandsCCurve*CDrawLineDoc::NewCurve(intnStyle,intnWidth,COLORREFcrColor){ CCurve*pNewCurve=newCCurve(nStyle,nWidth,crColor); m_curveList.AddTail(pNewCurve); SetModifiedFlag(); returnpNewCurve;}voidCDrawLineDoc::DeleteContents(){ while(!m_curveList.IsEmpty()){ deletem_curveList.RemoveHead(); } CDocument::DeleteContents();}四.修改CDrawLineView類,在該類地頭文件CDrawLineView.h與實現(xiàn)文件DrawLineView.cpp,添加如下內(nèi)容(其陰影地部分就是添加地內(nèi)容):classCDrawLineView:publicCScrollView{protected://createfromserializationonly CDrawLineView(); DECLARE_DYNCREATE(CDrawLineView)//Attributespublic: CDrawLineDoc*GetDocument();//Operationspublic://Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CDrawLineView) public: virtualvoidOnDraw(CDC*pDC);//overriddentodrawthisview protected: virtualvoidOnInitialUpdate();//calledfirsttimeafterconstruct //}}AFX_VIRTUAL//Implementationpublic: virtual~CDrawLineView();#ifdef_DEBUG virtualvoidAssertValid()const; virtualvoidDump(CDumpContext&dc)const;#endifprotected://Generatedmessagemapfunctionsprotected: //{{AFX_MSG(CDrawLineView) afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint); afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint); afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint); afx_msgvoidOnSelectLineStyle(); //}}AFX_MSG DECLARE_MESSAGE_MAP()private: CCurve*m_pCurveCurrent; CPointm_ptPrev; intnStyle; intnWidth; COLORREFcrColor; CPenpen,*pOldPen;};以上就是CDrawLineView類地頭文件內(nèi)容。#include"stdafx.h"#include"DrawLine.h"#include"DrawLineDoc.h"#include"DrawLineView.h"#include"LineStyleDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CDrawLineViewIMPLEMENT_DYNCREATE(CDrawLineView,CScrollView)BEGIN_MESSAGE_MAP(CDrawLineView,CScrollView) //{{AFX_MSG_MAP(CDrawLineView) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_MAND(IDM_SELECT_LINE_STYLE,OnSelectLineStyle) //}}AFX_MSG_MAP //Standardprintingmands ON_MAND(ID_FILE_PRINT,CScrollView::OnFilePrint) ON_MAND(ID_FILE_PRINT_DIRECT,CScrollView::OnFilePrint) ON_MAND(ID_FILE_PRINT_PREVIEW,CScrollView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CDrawLineViewconstruction/destructionCDrawLineView::CDrawLineView(){ nStyle=零; nWidth=一; crColor=零; pen.CreatePen(nStyle,nWidth,crColor); pOldPen=NULL;}CDrawLineView::~CDrawLineView(){ pen.DeleteObject();}///////////////////////////////////////////////////////////////////////////////CDrawLineViewdrawingvoidCDrawLineView::OnDraw(CDC*pDC){ CDrawLineDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);//在視圖顯示曲線網(wǎng)絡(luò) CTypedPtrList<CObList,CCurve*>&curveList=pDoc->m_curveList; POSITIONpos=curveList.GetHeadPosition(); while(pos){//遍歷曲線網(wǎng)絡(luò)地各條曲線,分別完成繪制 CCurve*pCurve=curveList.GetNext(pos); pCurve->DrawCurve(pDC); }}voidCDrawLineView::OnInitialUpdate(){ CScrollView::OnInitialUpdate(); SetScrollSizes(MM_TEXT,CSize(一零零,一零零));}///////////////////////////////////////////////////////////////////////////////CDrawLineViewdiagnostics#ifdef_DEBUGvoidCDrawLineView::AssertValid()const{ CScrollView::AssertValid();}voidCDrawLineView::Dump(CDumpContext&dc)const{ CScrollView::Dump(dc);}CDrawLineDoc*CDrawLineView::GetDocument()//non-debugversionisinline{ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawLineDoc))); return(CDrawLineDoc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CDrawLineViewmessagehandlersvoidCDrawLineView::OnLButtonDown(UINTnFlags,CPointpoint){ m_pCurveCurrent=GetDocument()->NewCurve(nStyle,nWidth,crColor); m_pCurveCurrent->AddNewPoint(point); SetCapture(); m_ptPrev=point;}voidCDrawLineView::OnMouseMove(UINTnFlags,CPointpoint){ if(GetCapture()!=this)return; CClientDCdc(this); pOldPen=dc.SelectObject(&pen); dc.MoveTo(m_ptPrev); dc.Lio(point); dc.SelectObject(pOldPen); m_pCurveCurrent->AddNewPoint(point); m_ptPrev=point;}voidCDrawLineView::OnLButtonUp(UINTnFlags,CPointpoint){ if(GetCapture()!=this)return; CClientDCdc(this); pOldPen=dc.SelectObject(&pen); dc.MoveTo(m_ptPrev); dc.Lio(point); dc.SelectObject(pOldPen); m_pCurveCurrent->AddNewPoint(point); ReleaseCapture();}五.為圖二.六地對話框設(shè)置對話框類⑴在資源編輯器里,新建一個對話框,按圖二.六地布局添加控件,為各控件與對話框資源配置ID并保存,各控件與對話框資源地ID如表二.一所示。表二.一各控件與對話框資源地ID資源名稱ID曲線線型下拉列表IDC_STYLE(Style里設(shè)置為DropList)線條寬度編輯框IDC_WIDTH線條顏色編輯框IDC_COLOR從顏色對話框選取顏色按鈕IDC_SELECT_FROM_DIALOG確定按鈕IDOK取消按鈕IDCANCEL對話框資源IDD_LINE_DIALOG⑵確保新地對話框資源在對話框編輯器處于打開狀態(tài),打開ClassWizard窗口。打開ClassWizard地方式有如下三種:①選擇窗口菜單View|ClassWizard;②選擇快捷菜單項ClassWizard;③按快捷鍵Ctrl+W。⑶在彈出地AddingaClass對話框,如圖二.一二所示,選擇Createanewclass單選按⑷在隨后彈出地NewClass對話框,如圖二.一三所示,只需填寫類地名稱CLineStyleDlg,單擊OK按鈕,關(guān)閉ClassWizard,對話框類地創(chuàng)建就完成了。在Workspace窗口地ClassView面板,可以看到增加了一個新地類CLineStyleDlg,選擇FileView面板,在HeaderFiles與SourceFiles文件夾,可以看到該類地頭文件LineStyleDlg.h與實現(xiàn)文件LineStyleDlg.cpp,文件名是類名稱除去開頭地類標(biāo)志"C"。圖二.一三填寫新類名稱對話框⑸添加對話框成員變量,創(chuàng)建一個對話框后,可以通過增加類地成員變量來操作對話框上地控件,打開ClassWizard對話框,選擇MemberVariables標(biāo)簽頁,在Classname下拉列表框選擇CLineStyleDlg類,如圖二.一四所示為控件添加變量,由于m_crColor變量代表地是顏色值,所以在設(shè)定該變量時,要為其設(shè)置最大值一六七七七二一五(即RGB(二五五,二五五,二五五),代表白色)與最小值零(RGB(零,零,零),代表黑色)。單擊OK按鈕關(guān)閉ClassWizard對話框,這樣就完成了為對話框地控件添加變量地工作。⑹為CLineStyleDlg對話框"從顏色對話框選擇顏色"按鈕添加消息處理函數(shù)。打開ClassWizard對話框,選擇MessageMaps標(biāo)簽頁,在Classname下拉列表框選擇CLineStyleDlg類,在ObjectIDs列表框選擇IDC_SELECT_FROM_DIALOG,在Messages列表框選擇BN_CLICKED,然后單擊AddFunction按鈕,彈出如圖二.一五所示地AddMemberFunction對話框,在該對話框地編輯框輸入OnSelectFromDialog,單擊OK按鈕就完成了為"從顏色對話框選擇顏色"按鈕添加消息處理函數(shù)地工作。該函數(shù)地主要作用是:①彈出顏色對話框;②從顏色對話框選取顏色后,關(guān)閉并返回顏色值;③在CLineStyleDlg對話框地線條顏色編輯框顯示顏色值。⑺對話框類地頭文件與實現(xiàn)文件地代碼如下,其陰影部分為"從顏色對話框選擇顏色"按鈕地消息處理函數(shù)代碼,該段代碼是手工添加地,其余地代碼都是由ClassWizard自動生成地。LineStyleDlg.h代碼:classCLineStyleDlg:publicCDialog{//Constructionpublic: CLineStyleDlg(CWnd*pParent=NULL);//standardconstructor//DialogData //{{AFX_DATA(CLineStyleDlg) enum{IDD=IDD_LINE_DIALOG}; DWORD m_crColor; int m_nWidth; int m_nStyle; //}}AFX_DATA//Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CLineStyleDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL//Implementationprotected: //Generatedmessagemapfunctions //{{AFX_MSG(CLineStyleDlg) afx_msgvoidOnSelectFromDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP()};LineStyleDlg.cpp代碼:#include"stdafx.h"#include"DrawLine.h"#include"LineStyleDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CLineStyleDlgdialogCLineStyleDlg::CLineStyleDlg(CWnd*pParent/*=NULL*/) :CDialog(CLineStyleDlg::IDD,pParent){ //{{AFX_DATA_INIT(CLineStyleDlg) m_crColor=零; m_nWidth=一; m_nStyle=零; //}}AFX_DATA_INIT}voidCLineStyleDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CLineStyleDlg) DDX_Text(pDX,IDC_COLOR,m_crColor); DDV_MinMaxUInt(pDX,m_crColor,零,一六七七七二一五); DDX_Text(pDX,IDC_WIDTH,m_nWidth); DDV_MinMaxInt(pDX,m_nWidth,一,二零); DDX_CBIndex(pDX,IDC_STYLE,m_nStyle); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CLineStyleDlg,CDialog) //{{AFX_MSG_MAP(CLineStyleDlg) ON_BN_CLICKED(IDC_SELECT_FROM_DIALOG,OnSelectFromDialog) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CLineStyleDlgmessagehandlersvoidCLineStyleDlg::OnSelectFromDialog(){ CColorDialogdlg; if(dlg.DoModal()==IDOK)m_crColor=dlg.GetColor(); SetDlgItemInt(IDC_COLOR,m_crColor,FALSE);}⑻添加菜單,選擇Workspace地ResourceView面板,修改菜單項IDR_MAINFRAME,刪除不必要地菜單,并添加"設(shè)置"菜單,ID值設(shè)為IDM_SELECT_LINE_STYLE,如圖二.一六所示。⑼在CDrawLineView類為"設(shè)置"菜單添加命令處理函數(shù)。打開ClassWizard對話框,選擇MessageMaps標(biāo)簽頁,在Classname下拉列表框選擇CDrawLineView類,在ObjectIDs列表框選擇IDM_SELECT_LINE_STYLE,在Messages列表框選擇MAND,然后單擊AddFunction按鈕,彈出AddMemberFunction對話框,在該對話框地編輯框輸入OnSelectLineStyle,單擊OK按鈕就完成了為"設(shè)置"菜單按鈕添加命令處理函數(shù)地工作,然后單擊EditCode按鈕,添加如下代碼。該函數(shù)地主要作用就是顯示"曲線屬"對話框。用戶可以方便地從該對話框選擇曲線地屬,然后行繪制。voidCDrawLineView::OnSelectLineStyle(){ CLineStyleDlgdlg; dlg.m_nStyle=nStyle; dlg.m_nWidth=nWidth; dlg.m_crColor=crColor; if(dlg.DoModal()!=IDOK)return; nStyle=dlg.m_nStyle; nWidth=dlg.m_nWidth; crColor=dlg.m_crColor; pen.DeleteObject(); pen.CreatePen(nStyle,nWidth,crColor);}六.修改stdafx.h文件。由于CTypedPtrList與CArray都是模板類,所以要包含頭文件afxtempl.h,在stdafx.h文件添加如下代碼:#include<afxtempl.h>七.編譯與運(yùn)行。輸入上述代碼之后,經(jīng)過編譯與運(yùn)行就生成了如圖二.一七所示地界面。測試與思考一.單擊設(shè)置菜單,在打開地曲線屬對話框地線型下拉列表框選擇各種線型(如果選項拉不開,可以用文本編輯方式打開資源文件(DrawLine.rc文件),找到boBox(IDC_STYLE),修改它地高度值),在寬度編輯框輸入各種寬度,在顏色編輯框輸入顏色值,或者點擊編輯框下邊地"從顏色對話框選擇顏色"按鈕來選擇顏色,然后點擊確定按鈕后就確定了將要繪制地曲線屬。然后在視圖通過拖動鼠標(biāo)畫線。注意:⑴如果選擇地線型為非實線,并且寬度大于一,則畫出地曲線仍然為實線,即不能繪制寬度大于一地非實線。⑵寬度地單位為象素,最小值為一,這里規(guī)定地最大值為二零;⑶顏色值為紅,綠,藍(lán)三色地混合,最小值為零,即黑色,RGB(零,零,零),最大值為一六七七七二一五,RGB(二五五,二五五,二五五),即白色,可以通過顏色對話框選擇。二.每條曲線地繪制從按下鼠標(biāo)左鍵開始,到松開鼠標(biāo)左鍵結(jié)束;第一條曲線繪制完畢,當(dāng)再次按下鼠標(biāo)左鍵時,開始新地曲線地繪制;在繪制新地曲線之前,可以通過曲線屬對話框選擇新地曲線屬,如果沒有設(shè)置新地屬,則新繪制地曲線地屬與上一次繪制地相同。三.選擇文件菜單地保存或另存為命令,可以把當(dāng)前地文檔以指定地文件名保存到指定地文件夾。選擇文件菜單地打開命令,打開保存過地曲線文件并顯示。四.可以行擴(kuò)展地地方:⑴增加"打印"與"打印預(yù)覽"地功能。⑵增加"放大"與"縮小"地功能,曲線可以無限放大或縮小而不失真。⑶增加編輯功能,即實現(xiàn)曲線地刪除,修改與取消操作等功能。

二.三.三課程設(shè)計三:模擬時鐘應(yīng)用程序通過前面章節(jié)地學(xué),本節(jié)以實例為背景學(xué)基于MFC地WINDOWS應(yīng)用程序設(shè)計,編寫一個模擬時鐘程序,此程序在屏幕左方有一個指針式鐘面,右方有兩個矩形框,上面以數(shù)字方式顯示日期與時間,該時間應(yīng)與指針顯示地時間一致,下方地矩形框作為秒表。用菜單選項或按鈕設(shè)置時間與秒表。時間不必與機(jī)器系統(tǒng)時間相同,可任意設(shè)置。一.編程要求⑴為該程序設(shè)計一個美觀大方地圖標(biāo)。⑵程序界面設(shè)計合理,色彩得體大方,顯示正確。⑶時針,分針與秒針形象美觀,即使各指針重合也可辨認(rèn)。⑷各指針運(yùn)動規(guī)律正確。為便于演示,時鐘速度應(yīng)比實際時間快二零倍,即一小時相當(dāng)于三分鐘。⑸數(shù)字式時鐘地時間顯示與指針式時鐘顯示一致。⑹按下設(shè)置時間按鈕或菜單項可彈出一對話框,用于設(shè)置當(dāng)前地時間與日期。⑺按下秒表控制按鈕后,秒表顯示窗顯示從零開始地時間,單位為百分之一秒。再次按下秒表控制按鈕后計時停止,該窗口顯示累計時間。二.問題分析本題主要涉及到地知識點有:時鐘指針運(yùn)動算法,屏幕重繪方法,定時器消息,鼠標(biāo)消息,菜單命令,對話框,畫筆/畫刷,顯示文字等。指針運(yùn)動算法與屏幕重繪方法是本程序主要難點所在。不論何種指針,每次轉(zhuǎn)動均以π/三零弧度(一秒地角度)為基本單位,且都以表盤心為轉(zhuǎn)動圓心。計算指針端點(x,y)地公式如下:x=圓心x坐標(biāo)+指針長度*cos(指針方向角)y=圓心y坐標(biāo)+指針長度*sin(指針方向角)注意,指針長度是指自圓心至指針一個端點地長度(是整個指針地一部分),由于指針可能跨越圓心,因此一個指針需要計算兩個端點。三個指針地運(yùn)動是有關(guān)聯(lián)地,秒針轉(zhuǎn)一圈引起分針運(yùn)動一格,分針轉(zhuǎn)一圈引起時針運(yùn)動一格,因此應(yīng)該使用一個定時器消息來處理指針地運(yùn)動。若用三個定時器消息分別處理時針,分針與秒針地運(yùn)動,就會使問題復(fù)雜化且不易實現(xiàn)三個指針聯(lián)動地正確規(guī)律。采用一個定時器消息可以很容易實現(xiàn)指針聯(lián)動算法。由于屏幕地重繪速度很快(五零ms一次),如果采用全屏刪除式重繪則閃爍十分明顯,顯示效果不佳。本程序采用非刪除式重繪,假定指針將要移動一格,則先采用背景色(這里是白色)重繪原來指針以刪除原來位置地指針,再采用指針地顏色在當(dāng)前位置繪制指針;如果指針沒有動,則直接繪制指針。另外,秒表需要采用單獨(dú)地定時器消息控制。三.實現(xiàn)步驟⑴用AppWizard生成一個名為Clock地單文檔(SDI)程序框架。為了簡化應(yīng)用程序,在第四步時去掉Dockingtoolbar與Initialstatusbar選擇項,其它各選項均可用缺省設(shè)置。⑵編輯項目地菜單資源,在主框架窗口地主菜單(IDR_MAINFRAME)添加一個名為"時鐘控制"地下拉菜單。在"時鐘控制"菜單添加三個菜單選項"啟動時鐘","停止時鐘"與"時間設(shè)置"。并在菜單屬項設(shè)定"啟動時鐘"菜單地ID標(biāo)號為ID_START,"停止時鐘"菜單地ID標(biāo)號為ID_STOP,"時間設(shè)置"菜單地ID標(biāo)號為ID_SETTIME。為了簡化菜單,可刪除系統(tǒng)原有地"文件","編輯"菜單項。⑶利用ClassWizard為視圖類添加菜單命令處理函數(shù)。入ClassWizard地MessageMaps選項卡,選擇ClassName項為CClockView類,在ObjectIDs列表框分別選擇新添加地菜單選項地ID,在Messages列表框選擇MAND,按下AddFunction按鈕添加成員函數(shù)。ClassWizard會為"啟動時鐘","停止時鐘"與"時間設(shè)置"菜單選項添加相應(yīng)地消息響應(yīng)函數(shù)OnStart(),OnStop()與OnSettime()。⑷利用ClassWizard為視圖類添加定時器與鼠標(biāo)消息處理函數(shù)。入ClassWizard地MessageMaps選項卡,選擇ClassName項為CClockView類,在Messages列表框分別選擇定時器消息WM_TIMER與鼠標(biāo)消息WM_LBUTIONDOWN,按下AddFunction按鈕添加成員函數(shù)。ClassWizard會添加相應(yīng)地定時器與鼠標(biāo)消息響應(yīng)函數(shù)OnTimer與OnLButtonDown。⑸使用DeveloperStudio菜單地Insert/Resource…選項調(diào)出InsertSource對話框,為項目添加新地對話框資源。在對話框?qū)?修改對話框名為"時間設(shè)定"。在對話框增加用來輸入年,月,日,時,分,秒地編輯框控件,如圖二.二一所示。

通過控件屬,將年,月,日,時,分,秒等編輯控件地ID改為IDC_YEAR,IDC_MONTH,IDC_DAY,IDC_HOUR,IDC_MINUTE與IDC_SECOND。⑹設(shè)計好這個對話框模板后,利用ClassWizard自動建立對話框類。入ClassWizard后,它會發(fā)現(xiàn)已建立地對話框模板資源,并彈出一個對話框詢問是否要為該對話框模板建立類。按下"OK"按鈕,會彈出NewClass對話框,在Name欄填寫對話框類地名稱CSetTimeDlg后按"OK"按鈕,即可為對話框創(chuàng)建一個對應(yīng)地類。⑺利用ClassWizard為對話框類添加與各控件對應(yīng)地數(shù)據(jù)成員。選擇MemberVariables選項卡,確保ClassName項為對話框CSetTimeDlg類,然后在選項卡下方地窗口選擇各控件地ID并按下"AddVariable…"按鈕,為其添加對應(yīng)成員變量,如表二.二所示。表二.二

編輯控件屬ControlIDsVariableTypeMembervariablenameVariableRangeIDC_YEARintm_Year零~三零零零IDC_MONTHintm_Mouth一~一二IDC_DAYintm_Day一~三一IDC_HOURintm_Hour零~二三IDC_MINUTEintm_Minute零~五九IDC_SECONDintm_Second零~五九

最后一列為變量取值范圍。⑻編輯工程地圖標(biāo)資源,在ResourceView選項窗口修改Icon結(jié)點所包含地主框架圖標(biāo)(IDR_MAINFRAME),修改標(biāo)準(zhǔn)圖標(biāo)(三二像素×三二像素)及小圖標(biāo)(一六像素×一六像素),從而為該程序設(shè)計一個美觀大方地圖標(biāo)。⑼完成以上工作后,即可修改程序框架,添加必要地代碼。四.程序清單按以下步驟向視圖類(CClockView)添加下列數(shù)據(jù)成員及成員函數(shù)。⑴添加表示年,月,日,時,分,秒地變量。intyear;intmonth;intday;inthour;intminute;intsecond;⑵添加秒表地計數(shù)變量。intwatch;⑶添加時鐘地畫筆及畫刷變量。CPenm_HouPen,m_MinPen,m_SecPen; //各種針地畫筆CBrushm_MarkBrush; //表盤標(biāo)記地畫刷⑷添加時鐘控制變量。CPointm_Center; //表地心doublem_Radius; //表地半徑CPointm_Hour[二],m_OldHour[二]; //時針當(dāng)前及前一次位置CPointm_Minute[二],m_OldMin[二]; //分針當(dāng)前及前一次位置CPointm_Second[二],m_OldSec[二]; //秒針當(dāng)前及前一次位置⑸添加秒表地兩個按鈕位置變量。CRectm_WatchStart;CRectm_WatchStop;⑹添加兩個函數(shù),計算時鐘各指針位置。voidSetClock(inthour,intminute,intsecond);CPointGetPoint(intnLenth,intnValue);⑺在視圖類構(gòu)造函數(shù)增加初始化語句:CClockView::CClockView(){//設(shè)定時間year=二零一五;month=六;day=一;hour=一一;minute=三零;second=一二;//設(shè)定畫筆/畫刷m_HouPen.CreatePen(PS_SOLID,五,RGB(二五五,零,零)); //時針畫筆m_MinPen.CreatePen(PS_SOLID,三,RGB(零,零,二五零)); //分針畫筆m_SecPen.CreatePen(PS_SOLID,一,RGB(零,零,零)); //秒針畫筆m_MarkBrush.CreateSolidBrush(RGB(二五零,二五零,零));

//設(shè)定表心位置m_Center.x=二零零;m_Center.y=二零零;

//設(shè)定時鐘半徑m_Radius=二零零;

//計算指針位置

SetClock(hour,minute,second);

//設(shè)定秒表計數(shù)器及按鈕位置watch=零;m_WatchStart=CRect(四八零,三一零,五六零,三四零); //啟動按鈕m_WatchStop=CRect(五九零,三一零,六七零,三四零); //停止按鈕}⑻編寫指針位置計算函數(shù)SetClock與GetPoint。首先在ClockView.cpp文件頭部添加下面兩行代碼,以便行數(shù)學(xué)計算。#include"math.h"#definePI三.一四一五九二六五然后添加下列代碼:

//計算各個指針位置地函數(shù)voidCClockView::SetClock(inthour,intminute,intsecond){hour=hour*五;hour=hour+minute/一二;

//保存時針原位置m_OldHour[零]=m_Hour[零];m_OldHour[一]=m_Hour[一];

//計算時針當(dāng)前位置m_Hour[零]=GetPoint(int(m_Radius/二),hour);m_Hour[一]=GetPoint(七,hour+三零);//保存分針原位置m_OldMin[零]=m_Minute[零];m_OldMin[一]=m_Minute[一];//計算分針當(dāng)前位置m_Minute[零]=GetPoint(int(m_Radius*七/一零),minute);m_Minute[一]=GetPoint(一零,minute+三零);//保存秒針原位置m_OldSec[零]=m_Second[零];m_OldSec[一]=m_Second[一];//計算秒針當(dāng)前位置m_Second[零]=GetPoint(int(m_Radius*八/一零),second);m_Second[一]=GetPoint(三零,second+三零);}//計算以表心為原點地指針地端點位置CPointCClockView::GetPoint(intnLenth,intnValue){CPointp;doubleangle=nValue*PI/三零-PI/二;p.x=m_Center.x+(int)(nLenth*cos(angle));p.y=m_Center.y+(int)(nLenth*sin(angle));returnp;}⑼繪制表盤上地標(biāo)記,時針,分針與秒針,并顯示數(shù)字時鐘及秒表:在OnDraw函數(shù)添加下面代碼:voidCClockView::OnDraw(CDC*pDC){CClockDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//繪制表盤上地標(biāo)記pDC->SelectObject(m_MarkBrush);for(inti=零;i<六零;i++){CPointpt=GetPoint(一七五,i);if(i%五==零){pDC->Rectangle(pt.x-五,pt.y-五,pt.x+五,pt.y+五);}else{pDC->Ellipse(pt.x-二,pt.y-二,pt.x+二,pt.y+二);}}//畫時針pDC->SelectObject(m_HouPen);if(m_OldHour[零]!=m_Hour[零]){//用白色覆蓋原位置時針pDC->SetROP二(R二_WHITE);pDC->MoveTo(m_OldHour[零]);pDC->Lio(m_OldHour[一]);pDC->SetROP二(R二_COPYPEN);//時針繪制pDC->MoveTo(m_Hour[零]);pDC->Lio(m_Hour[一]);}else{//時針繪制pDC->MoveTo(m_Hour[零]);pDC->Lio(m_Hour[一]);}//畫分針pDC->SelectObject(m_MinPen);if(m_OldMin[零]!=m_Minute[零]){//用白色覆蓋原位置分針pDC->SetROP二(R二_WHITE);pDC->MoveTo(m_OldMin[零]);pDC->Lio(m_OldMin[一]);pDC->SetROP二(R二_COPYPEN);

//分針繪制pDC->MoveTo(m_Minute[零]);pDC->Lio(m_Minute[一]);}else{//分針繪制pDC->MoveTo(m_Minute[零]);pDC->Lio(m_Minute[一]);}//用白色覆蓋原位置秒針pDC->SelectObject(m_SecPen);pDC->SetROP二(R二_WHITE);pDC->MoveTo(m_OldSec[零]);pDC->Lio(m_OldSec[一]);pDC->SetROP二(R二_COPYPEN);//秒針繪制pDC->MoveTo(m_Second[零]);pDC->Lio(m_Second[一]);//數(shù)字時鐘顯示pDC->SelectStockObject(WHITE_BRUSH);pDC->Rectangle(四五零,三零,七零零,一八零);pDC->TextOut(五三五,二零,"當(dāng)前時間");CStringm_Date,m_Time;m_Date.Format("%四d年%四d月%四d日",year,month,day);pDC->TextOut(五一零,七零,m_Date);m_Time.Format("%四d點%四d分%四d秒",hour,minute,second);pDC->TextOut(五一零,一零零,m_Time);//秒表顯示pDC->Rectangle(四五零,二二零,七零零,三七零);pDC->TextOut(五四五,二零零,"秒表");intminSec=watch%一零零;intSec=(watch/一零零)%

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論