簡單的繪圖程序?qū)嶒瀳蟾鎋第1頁
簡單的繪圖程序?qū)嶒瀳蟾鎋第2頁
簡單的繪圖程序?qū)嶒瀳蟾鎋第3頁
簡單的繪圖程序?qū)嶒瀳蟾鎋第4頁
簡單的繪圖程序?qū)嶒瀳蟾鎋第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上面向?qū)ο蟪绦蛟O(shè)計實訓(基于MFC程序設(shè)計) 題目: 簡單的繪圖程序 院系專業(yè): 姓 名: 學 號: 同組其他學生(學號): 簡單繪圖程序說明1、功能分析目前這個軟件的主要功能有如下:1、 畫直線:通過OnLine()函數(shù)實現(xiàn)。2、 畫矩形:通過OnRectangle()函數(shù)實現(xiàn)。3、 畫圓角矩形:通過OnRoundrect()函數(shù)實現(xiàn)。4、 畫橢圓:通過OnEllipse()函數(shù)實現(xiàn)。5、 鉛筆工具:可以畫任意線條。通過直接在OnMouseMove(UINT nFlags, CPoint point)函數(shù)里面添加代碼實現(xiàn)。6、 右鍵彈出菜單:可以在客戶中點擊鼠標右鍵,

2、快速選擇常用菜單。通過OnContextMenu函數(shù)實現(xiàn)。7、 狀態(tài)欄顯示鼠標移動的坐標:在程序的右下角顯示,通過調(diào)用setWidnowText和GetParent()實現(xiàn)。8、 畫圖顏色選擇:可以畫任何顏色的線條,通過OnColor()函數(shù)實現(xiàn)。9、 線條類型及線寬的設(shè)置:可以將畫出的線條設(shè)置成實線、虛線、點線、點劃線,雙點劃線,還可以設(shè)置線條的粗細,通過實例這一功能立刻顯示所選擇線條的粗細及線型。通過新建CLineSettingDlg類,其中OnSelchangeLineStyle()函數(shù)實現(xiàn)線型的改變,OnChangeEditLineWidth()函數(shù)實現(xiàn)線寬的改變。再在CDrawVie

3、w類中調(diào)用OnLineSetting()函數(shù)實現(xiàn)畫筆的對話框,CLineSettingDlg類中的OnPaint()函數(shù)是實現(xiàn)示例功能的。10、 窗口的重繪時不擦除原來的內(nèi)容:新建CShape類用來保存線條的顏色,線寬,填充色等屬性,在窗口大小發(fā)生變化時有OnDraw(CDC* pDC)函數(shù)進行重繪工作,重繪中調(diào)用了各個繪圖函數(shù)的Draw(CDC *pDC)函數(shù)。11、 所繪圖形的保存于讀取,通過Serialize(CArchive &ar)函數(shù)進行序列化操作,將所繪圖形的信息通過文件的形式保存起來。2、系統(tǒng)總體框架簡單繪圖工具 畫直線畫矩形畫橢圓畫圓角矩形鉛筆工具 圖1 總體框架3、

4、模塊設(shè)計與分析3.1畫圖模塊:該模塊的大部份功能都寫在了CDrawView類里面。該模塊也是此次程序的重點模塊之一,主要負責畫一些簡單圖形,例如:直線、矩形、圓角矩形、橢圓、任意曲線(鉛筆)等等;有線型、線寬的設(shè)置;還有畫筆顏色和填充色的選擇,可以畫各種各樣顏色的線條;還包含的右鍵菜單設(shè)置的函數(shù)。 3.2窗口模塊:這部分大多數(shù)都是編譯器自動生成,只做了一些修改,例如:使程序一開始運行便最大話,還是自定義程序的標題。 3.3菜單模塊:該部分同樣大部分都是編譯器自動生成的,自己增添了一部分菜單例如:繪圖工具、顏色設(shè)置、線條設(shè)置等等。還有右鍵彈出菜單,有顏色及線條設(shè)置等等,讓使用者可以進行快速的操作

5、。 3.4工具欄與狀態(tài)欄模塊:除了編譯器自動生成的之外,還加入了畫直線、矩形、圓角矩形、橢圓、鉛筆等工具的快速選擇,狀態(tài)欄可以顯示鼠標移動的坐標。4、類的設(shè)計與分析 4.1、CAboutDlg類 由編譯器生成,只做了一處的修改:m_pMainWnd->SetWindowText(_T("簡單繪圖工具");/設(shè)定主框架窗口標題 4.2、CDrawView類 由編譯器自動生成的類表1 CDrawView類說明表名稱屬性說明m_flag數(shù)據(jù)成員用于選擇圖形的類型(直線,矩形,橢圓等)m_lMouseDown數(shù)據(jù)成員用于判斷鼠標按下的消息響應m_ptOld數(shù)據(jù)成員畫圖的臨時點

6、(也是繪圖結(jié)束的終點)m_ptOrigin數(shù)據(jù)成員畫圖的起點m_color數(shù)據(jù)成員畫筆顏色選擇m_vLineWidth數(shù)據(jù)成員指向顏色表的指針m_vLineStyle數(shù)據(jù)成員線條風格選擇OnContextMenu()成員函數(shù)右鍵彈出菜單OnDraw()成員函數(shù)窗口重繪OnEditColor()成員函數(shù)顏色選擇OnLine()成員函數(shù)畫直線OnRectangle()成員函數(shù)畫矩形OnRoundrect()成員函數(shù)畫圓角矩形OnEllipse()成員函數(shù)畫橢圓OnColor()成員函數(shù)改變線條顏色OnFillcolor()成員函數(shù)改變填充色OnLButtonDown()成員函數(shù)鼠標按下響應函數(shù)On

7、LButtonUp()成員函數(shù)鼠標彈起響應函數(shù)OnMouseMove()成員函數(shù)鼠標移動響應函數(shù)OnLineSetting()成員函數(shù)畫筆設(shè)置對話框響應函數(shù)部分源代碼:void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(m_flag=0)SetCapture();:SetCursor(m_hCross);m_ptOrigin = point;m_lMouseDown = true;elsem_ptOrigi

8、n = point;m_ptOld = point;/臨時點m_lMouseDown = true;/鼠標左鍵被按下SetCapture(); / 將鼠標消息發(fā)送到視窗口CRect rect;GetClientRect(&rect); / 得到客戶窗口的大小ClientToScreen(&rect); / 將當前窗口坐標轉(zhuǎn)換成屏幕坐標ClipCursor(&rect); / 把鼠標限定在其參數(shù)指定的矩形區(qū)域內(nèi)SetCursor(m_hCross);/ 獲得十字光標CScrollView:OnLButtonDown(nFlags, point);/*響應鼠標移動消息,將起

9、點與臨時點之間的線擦除*/void CDrawView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCString str;str.Format("x=%d,y=%d",point.x,point.y);/得到框架類窗口的指針GetParent(),然后指針強制轉(zhuǎn)換為框架類的類型(CMainFrame*)/調(diào)用狀態(tài)欄類的成員函數(shù)setWidnowText(CMainFrame*)GetParent()->m_wn

10、dStatusBar.SetWindowText(str);if( m_lMouseDown )/初始化CClientDC dc(this);CPen pen(m_vLineStyle,m_vLineWidth,m_color);dc.SelectObject(&pen);CBrush brush; /定義畫刷CPen * pOldPen = dc.SelectObject(&pen);/將畫筆選入DC,并保存以前所用的畫筆brush.CreateSolidBrush(m_fColor); /創(chuàng)建畫刷dc.SelectObject(&brush); /獲取畫刷if(m_

11、flag=0)CClientDC dc(this);CPen pen(m_vLineStyle,m_vLineWidth,m_color);dc.SelectObject(&pen);CDrawDoc *pDoc = GetDocument();ASSERT_VALID(pDoc);CPoint ptOrg, ptStart, ptEnd;ptOrg = GetScrollPosition(); / 獲得當前工作區(qū)原點的坐標ptStart = m_ptOrigin + ptOrg; / 加上原點的坐標來修正線段的坐標ptEnd = point + ptOrg;CCLine *pCLin

12、e = new CCLine(ptStart,ptEnd,m_vLineStyle, m_vLineWidth,m_color,m_fColor);pDoc->m_obArray.Add(pCLine);pDoc->SetModifiedFlag();dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin = point;switch(m_flag)case 1: /畫直線dc.SetROP2( R2_NOT ); /當前繪制的像素值設(shè)為屏幕像素值的反,這樣可以覆蓋掉上次的繪圖,(自動擦除上次繪制的圖形)dc.SelectStockObj

13、ect(NULL_BRUSH);/使圖線不遮去原有背景dc.MoveTo( m_ptOrigin );/這兩行代碼擦除從起點到dc.LineTo( m_ptOld );/上次鼠標移動到的位置之間的臨時線dc.SelectObject(&pen);dc.MoveTo( m_ptOrigin );/這兩行代碼從起點到鼠標當前位置畫線dc.LineTo( point );/ break;case 2: /畫矩形dc.SetROP2( R2_NOT );dc.SelectStockObject(NULL_BRUSH);dc.Rectangle(CRect(m_ptOrigin,m_ptOld)

14、;dc.SelectObject(&pen);dc.Rectangle(CRect(m_ptOrigin,point);break;case 3: /畫圓角矩形dc.SetROP2( R2_NOT );dc.SelectStockObject(NULL_BRUSH);dc.RoundRect(CRect(m_ptOrigin,m_ptOld),CPoint(15, 15);dc.RoundRect(CRect(m_ptOrigin,point),CPoint(15, 15);break;case 4: /畫橢圓dc.SetROP2( R2_NOT );dc.SelectStockObj

15、ect(NULL_BRUSH);dc.Ellipse(CRect(m_ptOrigin,m_ptOld);dc.Ellipse(CRect(m_ptOrigin,point);break;case 5: /畫圓,將橢圓的長軸長度與短軸長度相同即可dc.SetROP2( R2_NOT );dc.SelectStockObject(NULL_BRUSH);dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptOld.x,m_ptOrigin.y+m_ptOld.x-m_ptOrigin.x);dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,po

16、int.x,m_ptOrigin.y+point.x-m_ptOrigin.x);break;/switch 結(jié)束dc.SelectObject(pOldPen);/恢復先前的畫筆m_ptOld = point; /if 結(jié)束CScrollView:OnMouseMove(nFlags, point);void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(m_flag=0) if( m_lMouseDown )m

17、_lMouseDown = false;ReleaseCapture();ClipCursor( NULL );elseif( m_lMouseDown )m_lMouseDown = false;CClientDC dc(this);CPen pen(m_vLineStyle,m_vLineWidth,m_color);dc.SelectObject(&pen);CBrush brush; /定義畫刷brush.CreateSolidBrush(m_fColor); /創(chuàng)建畫刷dc.SelectObject(&brush); /獲取畫刷CPen * pOldPen = dc.

18、SelectObject(&pen);ReleaseCapture();ClipCursor( NULL );switch(m_flag)case 1: /畫直線 dc.SetROP2( R2_COPYPEN );/使用當前的畫筆的顏色 dc.MoveTo( m_ptOrigin ); /這兩行代碼從起點到鼠標當前位置畫線dc.LineTo( point ); /break;case 2: /畫矩形dc.Rectangle(CRect(m_ptOrigin,point);break;case 3: /畫圓角矩形dc.RoundRect(CRect(m_ptOrigin,point),C

19、Point(10,15);break;case 4: /畫橢圓dc.SetROP2( R2_COPYPEN );dc.Ellipse(CRect(m_ptOrigin,point);break;case 5: /畫圓dc.SetROP2( R2_COPYPEN );dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,m_ptOrigin.y+point.x-m_ptOrigin.x);break;/switch 結(jié)束/實現(xiàn)文件保存,將各圖形類的地址保存在CObArray m_obArray數(shù)組中 CDrawDoc* pDoc = GetDocument()

20、; /得到文檔類指針CShape *pShape ;CPoint ptOrg;ptOrg = GetScrollPosition(); / 獲得當前工作區(qū)原點的坐標m_ptOrigin = m_ptOrigin + ptOrg; / 加上原點的坐標來修正線段的坐標point = point + ptOrg;switch(m_flag)case 1:pShape = new CLine(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break; case 2:pShape = new CRectangle(m_ptOr

21、igin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break;case 3:pShape = new CRoundRect(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break;case 4:pShape = new CEllipse(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break;case 5:pShape = new CCircle(m_ptOrigin,poi

22、nt,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break; pDoc->m_obArray.Add(pShape);pDoc->SetModifiedFlag();/if 結(jié)束m_lMouseDown = false;CScrollView:OnLButtonUp(nFlags, point);4.3、CMainFrame類主要由編譯器生成,做了小部分修改:/工具條的風格if (!s_ShapeToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_LEFT

23、| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!s_ShapeToolBar.LoadToolBar(IDR_SHAPETOOLBAR)TRACE0("Failed to create toolbarn");return -1; / fail to createint nCount =s_ShapeToolBar.GetToolBarCtrl().GetButtonCount();/設(shè)置工具條按鈕能被按下并且彈起for(int i=0;i<nCount;i+) s_ShapeTool

24、Bar.SetButtonStyle(i,TBBS_CHECKGROUP); s_ShapeToolBar.EnableDocking(CBRS_ALIGN_ANY);/以下兩行使形狀工具條和標準工具條具有??磕芰?并且可以??吭谌魏蔚胤絤_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);DockControlBar(&s_ShapeToolBar,AFX_IDW_DOCKBAR_LEFT,NULL);/使形狀工具條停靠在客戶

25、區(qū)左邊。用于改變工具條停靠的地方。4.4、CLineSettingDlg類由自己創(chuàng)建,主要是響應菜單中的各個設(shè)置選項,該類實現(xiàn)的功能比較少。表1 CSettingDlg類說明表名稱屬性說明m_LineWidth數(shù)據(jù)成員記錄線的粗細m_LineStyle數(shù)據(jù)成員記錄線條的類型OnChangeEditLineWidth()OnSelchangeLineStyle()成員函數(shù)編輯框控件(ID_LINESETTING)的響應函數(shù)OnPaint()成員函數(shù)在示例中顯示所需要的線型和線寬部分源代碼:void CLineSettingDlg:OnPaint() CPaintDC dc(this); / de

26、vice context for painting/ TODO: Add your message handler code hereUpdateData();CPen pen(m_LineStyle, m_LineWidth, m_color);/創(chuàng)建畫筆dc.SelectObject(&pen);CRect rect;GetDlgItem(IDC_SAMPLE)->GetWindowRect(rect);ScreenToClient(rect);dc.MoveTo(rect.left+20,(rect.top+rect.bottom)/2);dc.LineTo(rect.ri

27、ght-20,(rect.top+rect.bottom)/2);/ Do not call CDialog:OnPaint() for painting messagesvoid CLineSettingDlg:OnSelchangeLineStyle() / TODO: Add your control notification handler code hereint index = (CComboBox*)GetDlgItem(IDC_LINESTYLE)->GetCurSel(); m_LineStyle = index; Invalidate();void CLineSett

28、ingDlg:OnChangeEditLineWidth() / 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./ TODO: Add your control notification handl

29、er code hereInvalidate(); 4.5、Chape類 由自己創(chuàng)建,主要用于保存線條的顏色,線寬,填充色等屬性,在窗口重繪時起重要作用。名稱屬性說明m_flag數(shù)據(jù)成員用于選擇圖形的類型(直線,矩形,橢圓等)m_lMouseDown數(shù)據(jù)成員用于判斷鼠標按下的消息響應m_ptEnd數(shù)據(jù)成員畫圖的終點m_ptOrigin數(shù)據(jù)成員畫圖的起點m_fColor數(shù)據(jù)成員填充色選擇m_color數(shù)據(jù)成員畫筆顏色選擇m_LineWidth數(shù)據(jù)成員線寬選擇m_LineStyle數(shù)據(jù)成員線條風格選擇部分源代碼:CShape:CShape(CPoint p1, CPoint p2, UINT ps

30、, int pw, COLORREF cl,COLORREF c2)this->m_ptOrigin = p1;this->m_ptEnd = p2;this->m_LineStyle = ps;this->m_LineWidth = pw;this->m_color = cl; this->m_fColor = c2; 4.6、CLine,CCLine,CCircle,CEllipse,CRectangle,CRoundRect類 由自己創(chuàng)建,由自己創(chuàng)建,它們都是由Chape類派生出來,用于繪制各種不同類型的圖形,顏色,線條等屬性均取自于Chape類。部分

31、源代碼:void CLine:Draw(CDC *pDC)CPen pen(m_LineStyle, m_LineWidth, m_color);pDC->SelectObject(&pen);CBrush brush(m_fColor);pDC->SelectObject(&brush); pDC->MoveTo(m_ptOrigin.x,m_ptOrigin.y); pDC->LineTo(m_ptEnd.x,m_ptEnd.y);void CEllipse:Draw(CDC *pDC)CPen pen(m_LineStyle, m_LineWidth, m_color);pDC->SelectObject(&pen);CBrush brush(m_fColor);pDC->

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論