版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、簡(jiǎn)單繪圖程序1 需求說(shuō)明1.1 問(wèn)題描述設(shè)計(jì)一個(gè)簡(jiǎn)單的繪圖應(yīng)用程序,可以繪制圖形或自由繪制線(xiàn)段,可以更改顏色、畫(huà)筆粗細(xì)、保存文件。1.2功能說(shuō)明1. 圖形繪制功能:直線(xiàn)、橢圓、矩形。在菜單欄中選擇需要的圖形(也可以通過(guò)工具欄中選擇)用鼠標(biāo)便能在視圖中繪出相應(yīng)的圖形。2.可以繪制自由線(xiàn)段3.對(duì)圖形的操作:能通過(guò)菜單欄彈出對(duì)話(huà)框選擇線(xiàn)寬、自定義顏色,也可以擦除繪制的線(xiàn)段。4.可以保存繪圖文件,保存后打開(kāi)可以繼續(xù)繪制。2. 1.3 數(shù)據(jù)說(shuō)明在程序運(yùn)行以后,當(dāng)用戶(hù)單擊某個(gè)菜單項(xiàng)時(shí),應(yīng)該把用戶(hù)的選擇保存起來(lái),以便隨后的繪圖操作使用。在CDzyView類(lèi)中添加一個(gè)私有變量xz;用來(lái)保存用戶(hù)的選擇(直線(xiàn)、矩
2、形、橢圓、自由繪圖)在繪制時(shí)都可有兩點(diǎn)來(lái)確定其圖形。當(dāng)鼠標(biāo)左擊時(shí)得到一個(gè)點(diǎn),當(dāng)鼠標(biāo)停止移動(dòng)時(shí)得到另外一個(gè)點(diǎn)。為視圖類(lèi)CDzyView分別捕獲鼠標(biāo)左鍵按下和彈起這兩個(gè)消息。當(dāng)鼠標(biāo)左鍵按下時(shí),需要將鼠標(biāo)當(dāng)前按下點(diǎn)保存至sx、sy,在鼠標(biāo)移動(dòng)停止后,將當(dāng)前坐標(biāo)保存至ex,ey.其他主要數(shù)據(jù)說(shuō)明:int fd 判斷是否為自由繪圖模式int w 線(xiàn)寬int R RGB中的Rint G RGB中的Gint B RGB中的BCGraph類(lèi)中int m_nType: 保存后重繪時(shí)用戶(hù)的選擇int qdx; 重繪起點(diǎn)xint qdy; 重繪起點(diǎn)yint zdx; 重繪終點(diǎn)xint zdy; 重繪終點(diǎn)yCLine
3、類(lèi)中int cx; 重繪線(xiàn)寬int sx; 重繪起點(diǎn)xint sy; 重繪起點(diǎn)yint zx; 重繪終點(diǎn)xint zy; 重繪終點(diǎn)yint w; 重繪線(xiàn)寬 自定義顏色對(duì)話(huà)框關(guān)聯(lián)變量:IDC_EDIT_REDintm_RedIDC_EDIT_GREENintm_GreenIDC_EDIT_BLUEint m_BlueIDC_SCROLL_REDCScrollBarm_SredIDC_SLIDER_GREENCSliderCtrl m_SgreenIDC_SPIN_BLUECSpinButtonCtrlm_Sblue 2 分析、設(shè)計(jì)與實(shí)現(xiàn)2.1 主要功能設(shè)計(jì)與實(shí)現(xiàn)2.1.1 有關(guān)文檔視圖功能的設(shè)計(jì)
4、與實(shí)現(xiàn)單文檔結(jié)構(gòu)可序列化的類(lèi)CGraph從CObject派生可序列化的類(lèi)CLine從CObject派生對(duì)話(huà)框類(lèi)zdyyanse從CDialog派生2.1.2 有關(guān)消息處理的設(shè)計(jì)與實(shí)現(xiàn)方案:需要響應(yīng)的消息應(yīng)有:鼠標(biāo)移動(dòng)、鼠標(biāo)左鍵按下、鼠標(biāo)左鍵抬起、菜單欄中的畫(huà)矩形、畫(huà)直線(xiàn)、畫(huà)橢圓、自由繪圖、更多選項(xiàng)中的自定義顏色、工具欄中的紅色、藍(lán)色、綠色、線(xiàn)寬1、線(xiàn)寬2、線(xiàn)寬3、橡皮擦。整體思路為,用戶(hù)選擇不同的功能后就響應(yīng)相應(yīng)的消息處理函數(shù),給xz賦對(duì)應(yīng)的值。選擇不同的線(xiàn)寬,線(xiàn)色,即可改變畫(huà)筆或畫(huà)刷的屬性。鼠標(biāo)的按下響應(yīng)函數(shù)OnLButtonDown(),捕捉鼠標(biāo)當(dāng)前位置得到起點(diǎn)的坐標(biāo),鼠標(biāo)的拖動(dòng)響函數(shù)On
5、MouseMove()改變終點(diǎn)的坐標(biāo),鼠標(biāo)的彈起響應(yīng)OnLButtonUp(),得到繪制圖形。ID_DRAW_ELLIPSE:COMMAND 畫(huà)橢圓ID_DRAW_LINE:COMMAND 畫(huà)直線(xiàn)ID_DRAW_RECTANGLE:COMMAND 畫(huà)矩形ON_WM_LBUTTONDOWN 鼠標(biāo)左鍵按下ON_WM_LBUTTONUP 鼠標(biāo)左鍵抬起ON_WM_MOUSEMOVE 鼠標(biāo)移動(dòng)void CDzyView:OnDrawEllipse() / TODO: Add your command handler code herexz=3;/當(dāng)用戶(hù)選擇畫(huà)橢圓,將變量xz賦值為3.void CDzyV
6、iew:OnDrawLine() / TODO: Add your command handler code herexz=1;/當(dāng)用戶(hù)選擇畫(huà)直線(xiàn),將變量xz賦值為1.void CDzyView:OnDrawRectangle() / TODO: Add your command handler code herexz=2;/當(dāng)用戶(hù)選擇畫(huà)矩形,將變量xz賦值為2.void CDzyView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default
7、 sx=point.x;sy=point.y;fd=1;CView:OnLButtonDown(nFlags, point);/鼠標(biāo)左鍵按下,將當(dāng)前坐標(biāo)賦值給sx,sy 并判斷鼠標(biāo)是否按下(fd=1)void CDzyView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this); /this一般指向本窗口或當(dāng)前活動(dòng)視圖CPen pen; /定義畫(huà)筆pen.CreatePen(PS_SOLID,w,RGB(R,
8、G,B); /創(chuàng)建畫(huà)筆dc.SelectStockObject(NULL_BRUSH); dc.SelectObject(&pen); /獲取畫(huà)筆 fd=0;switch (xz)case 1:dc.MoveTo(sx,sy);dc.LineTo(ex,ey);break; case 2: dc.Rectangle(sx,sy,ex,ey);break;case 3:dc.Ellipse(sx,sy,ex,ey);break; CGraph *pGraph=new CGraph(xz,sx,sy,ex,ey,w,R,G,B); GetDocument()-m_obArray.Add(pGrap
9、h); CView:OnLButtonUp(nFlags, point); CDzyDoc* pDoc=GetDocument();/鼠標(biāo)抬起時(shí)進(jìn)行繪圖,并將用戶(hù)畫(huà)的每一個(gè)圖形對(duì)象保存到m_obArray中void CDzyView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultex=point.x;ey=point.y;CMainFrame *pFrame; pFrame=(CMainFrame *)AfxGetApp()-m_pMain
10、Wnd ; /獲得指向主框架窗口的指針 CStatusBar *pStatus=&pFrame-m_wndStatusBar;/獲得指向主框架窗口上狀態(tài)條的地址 CString str; if(pStatus)str.Format(X=%d,point.x);pStatus-SetPaneText(1,str);/在第1個(gè)窗格中顯示str的內(nèi)容str.Format(Y=%d,point.y);pStatus-SetPaneText(2,str);/在第2個(gè)窗格中顯示str的內(nèi)容 if(xz=4) if(fd=1) CLine *pLine=new CLine(sx,sy,ex,ey,w,R,G
11、,B); GetDocument()-m_lineObarry.Add(pLine); CClientDC dc(this); CPen pen; /定義畫(huà)筆 pen.CreatePen(PS_SOLID,w,RGB(R,G,B); /創(chuàng)建畫(huà)筆 dc.SelectObject(&pen); /獲取畫(huà)筆 dc.MoveTo(sx,sy); dc.LineTo(point); sx=point.x; sy=point.y; CView:OnMouseMove(nFlags, point);/獲取終點(diǎn)坐標(biāo),并進(jìn)行自由繪圖操作,同時(shí)在狀態(tài)欄中顯示鼠標(biāo)當(dāng)前坐標(biāo)。并保存自由繪圖的坐標(biāo)。void CDzyV
12、iew:OnW1() / TODO: Add your command handler code herew=2;/將線(xiàn)寬設(shè)為2void CDzyView:OnW2() / TODO: Add your command handler code herew=3;/將線(xiàn)寬設(shè)為3void CDzyView:Onw3() / TODO: Add your command handler code herew=5;/將線(xiàn)寬設(shè)為5void CDzyView:OnBlue() / TODO: Add your command handler code hereR=0;G=0;B=255;/工具欄中選擇藍(lán)色
13、void CDzyView:OnRed() / TODO: Add your command handler code hereR=255;G=0;B=0;/工具欄中選擇紅色void CDzyView:OnGreen() / TODO: Add your command handler code hereR=0;G=255;B=0;/工具欄中選擇綠色void CDzyView:OnFreedraw() / TODO: Add your command handler code herexz=4;/自由繪圖void CDzyView:OnEraser() / TODO: Add your com
14、mand handler code hereR=255;G=255;B=255;xz=4;void CDzyView:Onzdy() / TODO: Add your command handler code herezdyyanse dlg; /定義對(duì)話(huà)框?qū)ο骾nt result=dlg.DoModal();if(result=IDOK)R=dlg.m_Red; B=dlg.m_Blue; G=dlg.m_Green;2.1.3 有關(guān)菜單、工具欄、狀態(tài)欄設(shè)計(jì)與實(shí)現(xiàn)保持原有菜單并添加 繪圖工具-矩形 顏色與線(xiàn)寬-顏色 自由繪圖 更多 橢圓 線(xiàn)寬-線(xiàn)寬1 直線(xiàn) 線(xiàn)寬2 線(xiàn)寬3工具欄:添加矩形、直
15、線(xiàn)、橢圓的快速繪圖按鈕 添加顏色快速選擇按鈕 添加線(xiàn)寬快速選擇按鈕狀態(tài)欄:設(shè)計(jì)顯示當(dāng)前鼠標(biāo)坐標(biāo) 2.1.4 有關(guān)對(duì)話(huà)框的設(shè)計(jì)與實(shí)現(xiàn)通過(guò)菜單點(diǎn)擊更多選項(xiàng)中的自定義顏色 彈出對(duì)話(huà)框 用滾動(dòng)條、滑動(dòng)條、旋轉(zhuǎn)按鈕修改3種顏色的值,并改變改變預(yù)覽值的填充色初始化單色的值為0255,應(yīng)把滾動(dòng)控件值的變化范圍限制在此區(qū)間,且初始值為0顏色的存儲(chǔ)3種單色值存放在編輯框的關(guān)聯(lián)變量中(int型)滾動(dòng)控件當(dāng)前值的變化和編輯框中數(shù)值的變化均應(yīng)改變這3個(gè)關(guān)聯(lián)變量(關(guān)聯(lián)變量與編輯框、滾動(dòng)控件聯(lián)動(dòng))可在相應(yīng)的消息處理函數(shù)中完成聯(lián)動(dòng)畫(huà)圖3種單色值每次變化,都重畫(huà)橢圓,所以畫(huà)橢圓的代碼應(yīng)放在每個(gè)消息處理函數(shù)中void zdyy
16、anse:OnChangeEditBlue() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEventMask()/ with the ENM_CHANGE flag ORed into the mask.UpdateData();m_Sblue.SetPos(m_Blue);/ TODO: Add yo
17、ur control notification handler code herevoid zdyyanse:OnChangeEditGreen() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEventMask()/ with the ENM_CHANGE flag ORed into the mask
18、.UpdateData();m_Sgreen.SetPos(m_Green);/ TODO: Add your control notification handler code herevoid zdyyanse:OnChangeEditRed() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEvent
19、Mask()/ with the ENM_CHANGE flag ORed into the mask.UpdateData();m_Sred.SetScrollPos(m_Red);/ TODO: Add your control notification handler code herevoid zdyyanse:OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) / TODO: Add your message handler code here and/or call defaultif(pScrollBar=&m_S
20、red) / 滾動(dòng)條switch(nSBCode) case SB_THUMBTRACK:/ 拖動(dòng)劃塊m_Sred.SetScrollPos(nPos);m_Red=nPos;break; case SB_LINEDOWN:/ 按zuo按鈕m_Red=m_Sred.GetScrollPos()+1;m_Sred.SetScrollPos(m_Red);break; case SB_LINEUP:/ 按 you按鈕m_Red=m_Sred.GetScrollPos()-1;m_Sred.SetScrollPos(m_Red);break; if(pScrollBar-GetDlgCtrlID()
21、=IDC_SLIDER_GREEN ) / 滑動(dòng)條 m_Green=m_Sgreen.GetPos(); UpdateData(false); CDC* pDC=GetDC(); CBrush newBrush; CPen newPen; newBrush.CreateSolidBrush(RGB(m_Red,m_Green,m_Blue); newPen.CreatePen(PS_SOLID,1,RGB(m_Red,m_Green,m_Blue); pDC-SelectObject(&newPen); pDC-SelectObject(&newBrush); pDC-Rectangle(50
22、,70,150,150); ReleaseDC(pDC);CDialog:OnHScroll(nSBCode, nPos, pScrollBar);BOOL zdyyanse:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_Sred.SetScrollRange(0,255);m_Sred.SetScrollPos(0);m_Sgreen.SetRange(0,255);m_Sgreen.SetPos(0);m_Sblue.SetRange(0,255);m_Sblue.SetPos(0)
23、;return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSEvoid zdyyanse:OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) / TODO: Add your message handler code here and/or call defaultm_Blue=nPos;UpdateData(false); CDC* pDC=GetDC();
24、 CBrush newBrush; CPen newPen; newBrush.CreateSolidBrush(RGB(m_Red,m_Green,m_Blue); newPen.CreatePen(PS_SOLID,1,RGB(m_Red,m_Green,m_Blue); pDC-SelectObject(&newPen); pDC-SelectObject(&newBrush); pDC-Rectangle(50,70,150,150); ReleaseDC(pDC);CDialog:OnVScroll(nSBCode, nPos, pScrollBar);2.1.5 有關(guān)圖形顯示的設(shè)計(jì)
25、與實(shí)現(xiàn)為用戶(hù)提供繪制矩形、橢圓、直線(xiàn)、自由曲線(xiàn)功能。根據(jù)用戶(hù)不同選擇賦予xz變量不同的值。然后在OnLButtonUp里添加如下代碼。CClientDC dc(this); /this一般指向本窗口或當(dāng)前活動(dòng)視圖CPen pen; /定義畫(huà)筆pen.CreatePen(PS_SOLID,w,RGB(R,G,B); /創(chuàng)建畫(huà)筆(字體,線(xiàn)寬,顏色)dc.SelectStockObject(NULL_BRUSH); dc.SelectObject(&pen); /獲取畫(huà)筆 fd=0;switch (xz)case 1:dc.MoveTo(sx,sy);dc.LineTo(ex,ey);break;
26、case 2: dc.Rectangle(sx,sy,ex,ey);break;case 3:dc.Ellipse(sx,sy,ex,ey);break;繪制直線(xiàn)時(shí),首先調(diào)用MoveTo函數(shù)移動(dòng)到原點(diǎn),然后調(diào)用LineTo函數(shù)繪制到終點(diǎn)。自由曲線(xiàn)需要判斷鼠標(biāo)是否按下,并在OnMouseMove里添加如下代碼:if(xz=4) if(fd=1) CLine *pLine=new CLine(sx,sy,ex,ey,w,R,G,B); GetDocument()-m_lineObarry.Add(pLine); CClientDC dc(this); CPen pen; /定義畫(huà)筆 pen.Cre
27、atePen(PS_SOLID,w,RGB(R,G,B); /創(chuàng)建畫(huà)筆 dc.SelectObject(&pen); /獲取畫(huà)筆 dc.MoveTo(sx,sy); dc.LineTo(point); sx=point.x; sy=point.y; 2.1.6 有關(guān)持久化的設(shè)計(jì)與實(shí)現(xiàn)定義的類(lèi)支持序列化: 1.給工程添加一個(gè)可序列化的類(lèi)CGraph。2. 在CGraph類(lèi)中重載Serialize()成員函數(shù)。3. 在類(lèi)CGraph實(shí)現(xiàn)文件中加入IMPLEMENT_SERIAL宏。4. 構(gòu)造CGraph類(lèi),做準(zhǔn)備工作。class CGraph : public CObject public:voi
28、d Draw(CDC* pDC);CGraph(int m_drawtype,int qdxx,int qdyy,int zdxx,int zdyy,int ztcx,int r,int g,int b);void Serialize(CArchive& ar);CGraph();virtual CGraph(); DECLARE_SERIAL(CGraph) int m_nType;int qdx;int qdy;int zdx;int zdy;int cx;int R;int G;int B;給類(lèi)CGraph添加一個(gè)帶參數(shù)的構(gòu)造函數(shù)CGraph:CGraph(int m_drawtype,
29、 int qdxx, int qdyy, int zdxx, int zdyy, int ztcx, int r, int g, int b)m_nType=m_drawtype;qdx=qdxx;qdy=qdyy;zdx=zdxx;zdy=zdyy;cx=ztcx;R=r;G=g;B=b;5. 在文檔類(lèi)中定義一個(gè)成員變量(變量類(lèi)型為CObArray,變量名為m_obArray。),用于保存每一個(gè)圖形對(duì)象。6. 將用戶(hù)畫(huà)的每一個(gè)圖形對(duì)象保存到m_obArray中。在OnLButtonUp函數(shù)中的原來(lái)代碼的尾部添加如下代碼:CGraph *pGraph=new CGraph(xz,sx,sy,e
30、x,ey,w,R,G,B); GetDocument()-m_obArray.Add(pGraph); CView:OnLButtonUp(nFlags, point); CDzyDoc* pDoc=GetDocument();7. 在CGraph類(lèi)中完成繪圖功能。8.保存和再顯示圖形。打開(kāi)Serialize函數(shù),將原來(lái)的代碼刪除,添加如下代碼:m_obArray.Serialize(ar);完善CGraph:Serialize()函數(shù),代碼如下:void CGraph:Serialize(CArchive &ar)if (ar.IsStoring()arm_nTypeqdxqdyzdxzdycxRGm_nTypeqdxqdyzdxzdycxRGB;在視圖類(lèi)OnDraw中添加:if (pDoc-m_obArray.GetSize()for(int i=0;im_obArray.GetSize();i+)CDC* pDC = GetDC();(CGr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 策劃公司前臺(tái)工作總結(jié)
- 運(yùn)輸物流行業(yè)顧問(wèn)工作總結(jié)
- 2024新年寄語(yǔ)匯編(32篇)
- 制冷技術(shù)轉(zhuǎn)讓協(xié)議書(shū)(2篇)
- 創(chuàng)業(yè)合作投資協(xié)議書(shū)(2篇)
- 2024年計(jì)算機(jī)專(zhuān)業(yè)實(shí)習(xí)心得體會(huì)
- 易錯(cuò)點(diǎn)08 中國(guó)近代史時(shí)間問(wèn)題-備戰(zhàn)2023年中考?xì)v史考試易錯(cuò)題(解析版)
- 地理中國(guó)的世界遺產(chǎn)課件中圖版選修
- 2025屆陜西省咸陽(yáng)市武功縣中考生物全真模擬試題含解析
- 《公共政策過(guò)程》課件
- 科研管理年終總結(jié)匯報(bào)
- 三年內(nèi)無(wú)重大違法記錄聲明
- 內(nèi)審員考試題庫(kù)(共五篇)
- 12S522-混凝土模塊式排水檢查井
- 2024-2025學(xué)年小學(xué)道德與法治二年級(jí)下冊(cè)統(tǒng)編版(部編版)(2024)教學(xué)設(shè)計(jì)合集
- 4s店維修原廠(chǎng)協(xié)議書(shū)范文
- 高等數(shù)學(xué)教材(文科)
- 新高考背景下2025年高考思想政治一輪復(fù)習(xí)策略講座
- 初中音樂(lè)欣賞課型互動(dòng)教學(xué)策略的構(gòu)建及實(shí)踐
- 2020-2021學(xué)年北京市西城區(qū)七年級(jí)(上)期末數(shù)學(xué)試卷(附答案詳解)
- DB13-T 5821-2023 預(yù)拌流態(tài)固化土回填技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論