版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、簡單繪圖程序1 需求說明1.1 問題描述設計一個簡單的繪圖應用程序,可以繪制圖形或自由繪制線段,可以更改顏色、畫筆粗細、保存文件。1.2功能說明1. 圖形繪制功能:直線、橢圓、矩形。在菜單欄中選擇需要的圖形(也可以通過工具欄中選擇)用鼠標便能在視圖中繪出相應的圖形。2.可以繪制自由線段3.對圖形的操作:能通過菜單欄彈出對話框選擇線寬、自定義顏色,也可以擦除繪制的線段。4.可以保存繪圖文件,保存后打開可以繼續(xù)繪制。2. 1.3 數(shù)據(jù)說明在程序運行以后,當用戶單擊某個菜單項時,應該把用戶的選擇保存起來,以便隨后的繪圖操作使用。在CDzyView類中添加一個私有變量xz;用來保存用戶的選擇(直線、矩
2、形、橢圓、自由繪圖)在繪制時都可有兩點來確定其圖形。當鼠標左擊時得到一個點,當鼠標停止移動時得到另外一個點。為視圖類CDzyView分別捕獲鼠標左鍵按下和彈起這兩個消息。當鼠標左鍵按下時,需要將鼠標當前按下點保存至sx、sy,在鼠標移動停止后,將當前坐標保存至ex,ey.其他主要數(shù)據(jù)說明:int fd 判斷是否為自由繪圖模式int w 線寬int R RGB中的Rint G RGB中的Gint B RGB中的BCGraph類中int m_nType: 保存后重繪時用戶的選擇int qdx; 重繪起點xint qdy; 重繪起點yint zdx; 重繪終點xint zdy; 重繪終點yCLine
3、類中int cx; 重繪線寬int sx; 重繪起點xint sy; 重繪起點yint zx; 重繪終點xint zy; 重繪終點yint w; 重繪線寬 自定義顏色對話框關聯(lián)變量:IDC_EDIT_REDintm_RedIDC_EDIT_GREENintm_GreenIDC_EDIT_BLUEint m_BlueIDC_SCROLL_REDCScrollBarm_SredIDC_SLIDER_GREENCSliderCtrl m_SgreenIDC_SPIN_BLUECSpinButtonCtrlm_Sblue 2 分析、設計與實現(xiàn)2.1 主要功能設計與實現(xiàn)2.1.1 有關文檔視圖功能的設計
4、與實現(xiàn)單文檔結構可序列化的類CGraph從CObject派生可序列化的類CLine從CObject派生對話框類zdyyanse從CDialog派生2.1.2 有關消息處理的設計與實現(xiàn)方案:需要響應的消息應有:鼠標移動、鼠標左鍵按下、鼠標左鍵抬起、菜單欄中的畫矩形、畫直線、畫橢圓、自由繪圖、更多選項中的自定義顏色、工具欄中的紅色、藍色、綠色、線寬1、線寬2、線寬3、橡皮擦。整體思路為,用戶選擇不同的功能后就響應相應的消息處理函數(shù),給xz賦對應的值。選擇不同的線寬,線色,即可改變畫筆或畫刷的屬性。鼠標的按下響應函數(shù)OnLButtonDown(),捕捉鼠標當前位置得到起點的坐標,鼠標的拖動響函數(shù)On
5、MouseMove()改變終點的坐標,鼠標的彈起響應OnLButtonUp(),得到繪制圖形。ID_DRAW_ELLIPSE:COMMAND 畫橢圓ID_DRAW_LINE:COMMAND 畫直線ID_DRAW_RECTANGLE:COMMAND 畫矩形ON_WM_LBUTTONDOWN 鼠標左鍵按下ON_WM_LBUTTONUP 鼠標左鍵抬起ON_WM_MOUSEMOVE 鼠標移動void CDzyView:OnDrawEllipse() / TODO: Add your command handler code herexz=3;/當用戶選擇畫橢圓,將變量xz賦值為3.void CDzyV
6、iew:OnDrawLine() / TODO: Add your command handler code herexz=1;/當用戶選擇畫直線,將變量xz賦值為1.void CDzyView:OnDrawRectangle() / TODO: Add your command handler code herexz=2;/當用戶選擇畫矩形,將變量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);/鼠標左鍵按下,將當前坐標賦值給sx,sy 并判斷鼠標是否按下(fd=1)void CDzyView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this); /this一般指向本窗口或當前活動視圖CPen pen; /定義畫筆pen.CreatePen(PS_SOLID,w,RGB(R,
8、G,B); /創(chuàng)建畫筆dc.SelectStockObject(NULL_BRUSH); dc.SelectObject(&pen); /獲取畫筆 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();/鼠標抬起時進行繪圖,并將用戶畫的每一個圖形對象保存到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個窗格中顯示str的內容str.Format(Y=%d,point.y);pStatus-SetPaneText(2,str);/在第2個窗格中顯示str的內容 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; /定義畫筆 pen.CreatePen(PS_SOLID,w,RGB(R,G,B); /創(chuàng)建畫筆 dc.SelectObject(&pen); /獲取畫筆 dc.MoveTo(sx,sy); dc.LineTo(point); sx=point.x; sy=point.y; CView:OnMouseMove(nFlags, point);/獲取終點坐標,并進行自由繪圖操作,同時在狀態(tài)欄中顯示鼠標當前坐標。并保存自由繪圖的坐標。void CDzyV
12、iew:OnW1() / TODO: Add your command handler code herew=2;/將線寬設為2void CDzyView:OnW2() / TODO: Add your command handler code herew=3;/將線寬設為3void CDzyView:Onw3() / TODO: Add your command handler code herew=5;/將線寬設為5void CDzyView:OnBlue() / TODO: Add your command handler code hereR=0;G=0;B=255;/工具欄中選擇藍色
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; /定義對話框對象int result=dlg.DoModal();if(result=IDOK)R=dlg.m_Red; B=dlg.m_Blue; G=dlg.m_Green;2.1.3 有關菜單、工具欄、狀態(tài)欄設計與實現(xiàn)保持原有菜單并添加 繪圖工具-矩形 顏色與線寬-顏色 自由繪圖 更多 橢圓 線寬-線寬1 直線 線寬2 線寬3工具欄:添加矩形、直
15、線、橢圓的快速繪圖按鈕 添加顏色快速選擇按鈕 添加線寬快速選擇按鈕狀態(tài)欄:設計顯示當前鼠標坐標 2.1.4 有關對話框的設計與實現(xiàn)通過菜單點擊更多選項中的自定義顏色 彈出對話框 用滾動條、滑動條、旋轉按鈕修改3種顏色的值,并改變改變預覽值的填充色初始化單色的值為0255,應把滾動控件值的變化范圍限制在此區(qū)間,且初始值為0顏色的存儲3種單色值存放在編輯框的關聯(lián)變量中(int型)滾動控件當前值的變化和編輯框中數(shù)值的變化均應改變這3個關聯(lián)變量(關聯(lián)變量與編輯框、滾動控件聯(lián)動)可在相應的消息處理函數(shù)中完成聯(lián)動畫圖3種單色值每次變化,都重畫橢圓,所以畫橢圓的代碼應放在每個消息處理函數(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) / 滾動條switch(nSBCode) case SB_THUMBTRACK:/ 拖動劃塊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 ) / 滑動條 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 有關圖形顯示的設計
25、與實現(xiàn)為用戶提供繪制矩形、橢圓、直線、自由曲線功能。根據(jù)用戶不同選擇賦予xz變量不同的值。然后在OnLButtonUp里添加如下代碼。CClientDC dc(this); /this一般指向本窗口或當前活動視圖CPen pen; /定義畫筆pen.CreatePen(PS_SOLID,w,RGB(R,G,B); /創(chuàng)建畫筆(字體,線寬,顏色)dc.SelectStockObject(NULL_BRUSH); dc.SelectObject(&pen); /獲取畫筆 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;繪制直線時,首先調用MoveTo函數(shù)移動到原點,然后調用LineTo函數(shù)繪制到終點。自由曲線需要判斷鼠標是否按下,并在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; /定義畫筆 pen.Cre
27、atePen(PS_SOLID,w,RGB(R,G,B); /創(chuàng)建畫筆 dc.SelectObject(&pen); /獲取畫筆 dc.MoveTo(sx,sy); dc.LineTo(point); sx=point.x; sy=point.y; 2.1.6 有關持久化的設計與實現(xiàn)定義的類支持序列化: 1.給工程添加一個可序列化的類CGraph。2. 在CGraph類中重載Serialize()成員函數(shù)。3. 在類CGraph實現(xiàn)文件中加入IMPLEMENT_SERIAL宏。4. 構造CGraph類,做準備工作。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;給類CGraph添加一個帶參數(shù)的構造函數(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. 在文檔類中定義一個成員變量(變量類型為CObArray,變量名為m_obArray。),用于保存每一個圖形對象。6. 將用戶畫的每一個圖形對象保存到m_obArray中。在OnLButtonUp函數(shù)中的原來代碼的尾部添加如下代碼: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類中完成繪圖功能。8.保存和再顯示圖形。打開Serialize函數(shù),將原來的代碼刪除,添加如下代碼:m_obArray.Serialize(ar);完善CGraph:Serialize()函數(shù),代碼如下:void CGraph:Serialize(CArchive &ar)if (ar.IsStoring()arm_nTypeqdxqdyzdxzdycxRGm_nTypeqdxqdyzdxzdycxRGB;在視圖類OnDraw中添加:if (pDoc-m_obArray.GetSize()for(int i=0;im_obArray.GetSize();i+)CDC* pDC = GetDC();(CGr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機床安全操作規(guī)程培訓
- 機工鍋爐實操培訓課件
- 護理部干事與護理行政管理的銜接
- 心電圖護理課件下載平臺
- 機場用電安全培訓內容課件
- 護理人員的職業(yè)倦怠與應對
- 高血壓科學管理
- 安全培訓計劃匯編課件
- 機場安全服務培訓課件
- 廣告學就業(yè)前景深度解讀
- 人教版二年級數(shù)學下冊 5 混合運算 第2課時 沒有括號的兩級混合運算(教學課件)
- 福建省泉州市2022-2023學年高一上學期期末教學質量監(jiān)測化學試題(含答案)
- 材料樣品確認單
- 英語book report簡單范文(通用4篇)
- PCB封裝設計規(guī)范
- 船舶建造 監(jiān)理
- YY/T 1447-2016外科植入物植入材料磷灰石形成能力的體外評估
- GB/T 9349-2002聚氯乙烯、相關含氯均聚物和共聚物及其共混物熱穩(wěn)定性的測定變色法
- GB/T 8331-2008離子交換樹脂濕視密度測定方法
- 美英報刊閱讀教程課件
- 幼兒園繪本故事:《十二生肖》 課件
評論
0/150
提交評論