版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2本講主要內(nèi)容矩形類(lèi)的實(shí)現(xiàn)與矩形的繪制 畫(huà)刷 3矩形類(lèi)的實(shí)現(xiàn)下面開(kāi)始實(shí)現(xiàn)以矩形圖元為代表的封閉圖形的繪制。本章的繪圖系統(tǒng)所涉及的封閉圖形有矩形(CRectangle)、橢圓(CEllipse)、圓(CCircle)、多邊形(CPolygon)、圓角矩形(CRoundRect)。下面以矩形為例具體介紹其繪制功能的實(shí)現(xiàn)。4矩形類(lèi)的實(shí)現(xiàn)根據(jù)10.1.3節(jié)所完成的繪圖系統(tǒng)類(lèi)層次關(guān)系,所有的封閉圖形都是填充類(lèi)CFill的子類(lèi)。下面我們?yōu)槔L圖系統(tǒng)添加繪制矩形的功能?!纠纠?0-9】 在例10-8程序基礎(chǔ)上,為MyDrawSystem繪圖程序添加繪制矩形的功能。5矩形類(lèi)的實(shí)現(xiàn)繪制矩形的步驟是這樣的:當(dāng)用戶
2、點(diǎn)擊菜單“繪圖|矩形”之后,就進(jìn)入到“繪制矩形”命令狀態(tài),這時(shí)在客戶區(qū)按下鼠標(biāo)左鍵就輸入了矩形的左上角或右下角坐標(biāo),拖動(dòng)鼠標(biāo),這時(shí)出現(xiàn)“橡皮矩形”,當(dāng)釋放鼠標(biāo)左鍵,一個(gè)矩形就被“畫(huà)”了出來(lái),即顯示在客戶區(qū)中。接著如果再次按下鼠標(biāo)左鍵拖動(dòng)釋放鼠標(biāo)左鍵,則畫(huà)出第二個(gè)矩形。如果在按下鼠標(biāo)左鍵的同時(shí)還按下了鍵盤(pán)上的Shift鍵,則畫(huà)出一個(gè)正方形。6矩形類(lèi)的實(shí)現(xiàn)【編程步驟】【編程步驟】(1)首先為菜單項(xiàng)“繪圖|矩形”添加相應(yīng)的消息響應(yīng)函數(shù)OnCreateRectangle()。將該命令項(xiàng)映射到視圖類(lèi)。添加代碼如下。void CMyDrawSystemView:OnCreateRectangle() /菜
3、單命令“繪圖|矩形”m_nFigureType=5; /5代表圖元為矩形/點(diǎn)擊菜單命令后獲得十字光標(biāo)句柄m_hCross=AfxGetApp() -LoadStandardCursor(IDC_CROSS); 7矩形類(lèi)的實(shí)現(xiàn)(2)選擇Insert|New Class命令,打開(kāi)New Class對(duì)話框,在ClassType中選擇“Generic Class”,在Name編輯框中鍵入“CRectangle”,在Base Class(es)框中,用鼠標(biāo)左鍵單擊“Derived From”下面的高亮區(qū),鍵入“CFill”。點(diǎn)擊OK,將彈出一個(gè)消息框,直接點(diǎn)擊“確定”,生成CRectangle類(lèi)的兩個(gè)支
4、持文件。為CRectangle類(lèi)定義成員變量和成員函數(shù)。包括表示矩形左上角坐標(biāo)和右下角坐標(biāo)、類(lèi)型為CPoint的成員變量m_TopLeft和m_BottomRight。 8矩形類(lèi)的實(shí)現(xiàn)另外矩形類(lèi)有“畫(huà)矩形”的動(dòng)作,要修改從其父類(lèi)CFill(實(shí)際上是祖父類(lèi)CLineType)那里繼承下來(lái)的成員函數(shù)Draw (),其功能是使用m_TopLeft和m_BottomRight兩點(diǎn)坐標(biāo)將矩形畫(huà)出來(lái)。9矩形類(lèi)的實(shí)現(xiàn)/Rectangle.h文件#include Fill.hclass CRectangle : public CFill protected:CPoint m_TopLeft,m_BottomR
5、ight; /矩形左上角坐標(biāo)和右下角坐標(biāo)public: CRectangle(); CRectangle(CPoint pt1,CPoint pt2,int width=1, int linetype=PS_SOLID, COLORREF linecolor=RGB(0,0,0),int fillpattern=0,COLORREF fillcolor=RGB(255,255,255); virtual CRectangle(); void Draw(CDC *pDC); /繪制矩形的成員函數(shù);10矩形類(lèi)的實(shí)現(xiàn)/Rectangle.cpp文件CRectangle:CRectangle() m_
6、TopLeft.x=m_TopLeft.y=0; m_BottomRight.x=m_BottomRight.y=0;CRectangle:CRectangle(CPoint pt1,CPoint pt2,int width,int linetype, COLORREF linecolor, int fillpattern,COLORREF fillcolor):CFill(width, linetype, linecolor,type, fillpattern, fillcolor) m_TopLeft = pt1; m_BottomRight = pt2;11矩形類(lèi)的實(shí)現(xiàn)CRectangl
7、e:CRectangle()void CRectangle:Draw(CDC *pDC) /繪制矩形的成員函數(shù) CPen *pPenOld; SetCurrentPen(m_nLineWidth, m_nLineType, m_LineColor); pPenOld = pDC-SelectObject(&m_CurrentPen); pDC-Rectangle(m_TopLeft.x,m_TopLeft.y,m_BottomRight.x,m_BottomRight.y); pDC-SelectObject(pPenOld);繪制矩形的方法非常簡(jiǎn)單,主要是調(diào)用CDC類(lèi)的成員函數(shù)Rectang
8、le()。函數(shù)聲明如下:BOOL Rectangle(int x1, int y1, int x2, int y2);BOOL Rectangle(LPCRECT lpRect);參數(shù)x1和y1,x2和y2分別代表所要繪制的矩形的左上角和右下角頂點(diǎn)坐標(biāo)值。參數(shù)lpRect則指定了所要繪制的矩形區(qū)域。 12矩形的繪制(3)點(diǎn)擊“繪圖|矩形”菜單命令后,進(jìn)入矩形繪制狀態(tài)。在客戶區(qū)按下鼠標(biāo)左鍵,首先得到矩形的一個(gè)頂點(diǎn)坐標(biāo),拖動(dòng)鼠標(biāo)出現(xiàn)橡皮線矩形,釋放鼠標(biāo)則得到矩形另一頂點(diǎn)。這時(shí)一個(gè)矩形畫(huà)完,動(dòng)態(tài)生成一個(gè)矩形類(lèi)對(duì)象,并將該對(duì)象加入圖元對(duì)象鏈表。如果在按下鼠標(biāo)左鍵的同時(shí)還按下了鍵盤(pán)上的Shift鍵,則畫(huà)
9、出一個(gè)正方形。首先,在視圖類(lèi)的文件MyDrawSystemView.cpp中添加#include Rectangle.h。接著添加如下代碼到三個(gè)鼠標(biāo)響應(yīng)函數(shù)中。 13矩形的繪制void CMyDrawSystemView:OnLButtonDown(UINT nFlags, CPoint point) case 5: /繪制矩形 SetCapture(); /捕獲鼠標(biāo) :SetCursor(m_hCross); /設(shè)置十字光標(biāo) m_StartPos = m_EndPos = point; /按下鼠標(biāo)左鍵即取得直線段起點(diǎn)坐標(biāo) m_nMouseStep+; /記錄鼠標(biāo)左擊次數(shù) m_BLine =
10、FALSE ; /標(biāo)志尚未生成了一個(gè)矩形 if( nFlags & MK_SHIFT) m_BShift = TRUE ; /按下鼠標(biāo)左鍵的同時(shí)按下了【Shift】鍵 break; CView:OnLButtonDown(nFlags, point);14矩形的繪制void CMyDrawSystemView:OnMouseMove(UINT nFlags, CPoint point) case 5: /繪制矩形 if(m_nMouseStep=1 & !m_BLine) /鼠標(biāo)左擊一次且沒(méi)有生成矩形 if(m_BShift = TRUE) /按下鼠標(biāo)左鍵的同時(shí)按下了【Shift】鍵 doub
11、le dx = point.x - m_StartPos.x; double dy = point.y - m_StartPos.y;double len = 0.707*sqrt(fabs(dx)*fabs(dx)+fabs(dy)*fabs(dy); /對(duì)角線長(zhǎng)度 m_EndPos.x = m_StartPos.x + len; m_EndPos.y = m_StartPos.y + len; 15矩形的繪制 else /如果未按下【如果未按下【Shift】鍵】鍵 CPen *pPenOld; SetCurrentPen(m_nPenWidth,m_nPenType, m_PenColor
12、); pPenOld = pDC-SelectObject(&m_CurrentPen); /先換支畫(huà)筆先換支畫(huà)筆 /以下設(shè)置以下設(shè)置DC COLORREF XorColor = pDC-GetBkColor() m_PenColor; CPen pen(m_nPenType, m_nPenWidth, XorColor), *oldpen; int oldmode = pDC-GetROP2(); oldpen = pDC-SelectObject(&pen); /設(shè)置為設(shè)置為“空空”刷,即不填充刷,即不填充CBrush* oldbrush = (CBrush*)pDC-SelectStoc
13、kObject(NULL_BRUSH); pDC-SetROP2(R2_XORPEN); /刪除原圖形刪除原圖形 pDC-Rectangle(m_StartPos.x,m_StartPos.y,m_EndPos.x, m_EndPos.y); m_EndPos = point; /繪新圖形繪新圖形 pDC-Rectangle(m_StartPos.x,m_StartPos.y,m_EndPos.x,m_EndPos.y); 16矩形的繪制 /以下恢復(fù)DC pDC-SetROP2(oldmode); pDC-SelectObject(oldpen); pen.DeleteObject(); pD
14、C-SelectObject(pPenOld); /恢復(fù)原來(lái)的畫(huà)筆 /(m_BShift = TRUE) /m_nMouseStep=1 & !m_BLine break; / switch(m_nFigureType) CView:OnMouseMove(nFlags, point);17矩形的繪制void CMyDrawSystemView:OnLButtonUp(UINT nFlags, CPoint point) case 5: /繪制矩形 pDC-SetROP2(m_nDrawMode); /松開(kāi)鼠標(biāo),繪圖模式也恢復(fù) if(!m_BShift) /按下鼠標(biāo)左鍵的未按下【Shift】鍵
15、 m_EndPos = point; /松開(kāi)鼠標(biāo)左鍵即取得直線段終點(diǎn)坐標(biāo) else m_BShift = FALSE; /按下【Shift】鍵的標(biāo)志取消 m_nMouseStep = 0 ; /一條直線已經(jīng)畫(huà)完。鼠標(biāo)左擊次數(shù)清零 m_BLine = TRUE ; /標(biāo)志生成了一個(gè)矩形 ReleaseCapture(); /釋放鼠標(biāo),還原鼠標(biāo)形狀18矩形的繪制 CRectangle *pRectangle; pRectangle = new CRectangle(m_StartPos, m_EndPos, m_nPenWidth,m_nPenType, m_PenColor); pDoc-m_F
16、igureList.AddTail(pRectangle); /將新繪制的直線存入圖元鏈表 break; / switch(m_nFigureType) Invalidate(); UpdateWindow(); CView:OnLButtonUp(nFlags, point);19矩形的繪制(4)OnDraw()函數(shù)不做任何改變。因?yàn)槔L制各種圖形的數(shù)據(jù)取自圖元鏈表,矩形也不例外。程序代碼仍然如前不變。20矩形的繪制編譯連接運(yùn)行程序,可以繪制矩形。 21畫(huà)刷當(dāng)繪制矩形、橢圓和多邊形等封閉的幾何圖形時(shí),除了使用畫(huà)筆,還必須使用畫(huà)刷。畫(huà)刷是用指定的顏色和圖案來(lái)填充幾何圖形的內(nèi)部區(qū)域。當(dāng)用戶獲取一個(gè)
17、繪圖用的設(shè)備環(huán)境時(shí),該設(shè)備環(huán)境使用GDI提供的默認(rèn)畫(huà)刷,其填充色為白色(WHITE_BRUSH)。與畫(huà)筆類(lèi)似,可以使用MFC畫(huà)刷類(lèi)CBrush創(chuàng)建自己的畫(huà)刷,用于填充圖形的繪制。22畫(huà)刷【例【例10-10】 以例10-9的程序?yàn)榛A(chǔ),為繪圖程序MyDrawSystem增加”設(shè)置|填充參數(shù)”命令,點(diǎn)擊該命令后調(diào)用“填充參數(shù)”對(duì)話框完成“填充圖案”、“填充顏色”的設(shè)置。運(yùn)行程序可以繪制不同填充顏色、填充圖案的矩形。23畫(huà)刷【編程步驟】【編程步驟】1. 主菜單IDR_MAINFRAME中已經(jīng)添加了“設(shè)置|填充參數(shù)”菜單資源。在CMyDrawSystemView類(lèi)中添加“填充參數(shù)”菜單響應(yīng)函數(shù)OnFi
18、llParameter()。2. 創(chuàng)建“填充參數(shù)”對(duì)話框。添加新的對(duì)話框資源,ID為IDD_DLG_FILL_PARA,Caption為 “設(shè)置填充參數(shù)”。添加靜態(tài)控件、列表框控件IDC_LIST_ FILL(注意:不勾選列表框控件的Sort屬性)和按鈕控件IDC_BUTTON_FILLCOLOR。 24畫(huà)刷3. 為“填充參數(shù)”對(duì)話框編程。(1)添加新類(lèi)CFillParaDlg。在CFillParaDlg類(lèi)中添加公有成員變量: COLORREF m_FillColor; /用于保存用戶在對(duì)話框中選中的顏色 UINTm_nFillPattern; /用于保存用戶在對(duì)話框中選中的填充圖案(2)對(duì)“
19、填充圖案”列表框控件進(jìn)行初始化。先添加對(duì)話框類(lèi)的初始化成員函數(shù)OnInitDialog。 25畫(huà)刷添加各控件的成員變量,為列表框控件IDC_LIST_ FILL 增加成員變量m_ListFill,類(lèi)型為控件類(lèi)CListBox。在OnInitDialog函數(shù)中添加初始化代碼如下。 26畫(huà)刷BOOL CFillParaDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_ListFill.AddString(純色純色);m_ListFill.AddString(45度左上右下陰影線度左上右下
20、陰影線);m_ListFill.AddString(45度叉線度叉線);m_ListFill.AddString(45度左下右上陰影線度左下右上陰影線);m_ListFill.AddString(垂直相交陰影線垂直相交陰影線);m_ListFill.AddString(水平陰影線水平陰影線);m_ListFill.AddString(垂直陰影線垂直陰影線);m_ListFill.SetCurSel(0);m_nFillPattern = 0;m_FillColor = RGB(0, 0, 0); return TRUE; 27畫(huà)刷(3)添加對(duì)話框中各個(gè)控件的消息響應(yīng)函數(shù)。 添加“填充圖案”列表
21、框的“LBN_SELCHANGE”消息的響應(yīng)函數(shù)。響應(yīng)函數(shù)OnSelchangeListFill()的代碼如下。void CFillParaDlg:OnSelchangeListFill() / TODO: Add your control notification handler code herem_nFillPattern = m_ListFill.GetCurSel(); 28畫(huà)刷添加“填充顏色對(duì)話框”按鈕的消息響應(yīng)函數(shù)。 添加代碼如下。void CFillParaDlg:OnButtonFillcolor() / TODO: Add your control notification
22、 handler code hereCColorDialog ColorDlg;if(ColorDlg.DoModal() = IDOK)m_FillColor = ColorDlg.GetColor();29畫(huà)刷4. 在視圖類(lèi)中添加填充參數(shù)變量如下。int m_nFillPattern; /圖元填充圖案 COLORREF m_FillColor; /圖元填充顏色并在視圖類(lèi)中初始化上述線型參數(shù)變量。代碼如下。CMyDrawSystemView:CMyDrawSystemView() int m_nFillPattern = 0; /初始化圖元填充圖案 COLORREF m_FillColor
23、= RGB(255,255,255); /初始化圖元填充顏色30畫(huà)刷5. 在“設(shè)置|填充參數(shù)”菜單命令響應(yīng)函數(shù)OnFillParameter()中添加對(duì)“設(shè)置填充參數(shù)”對(duì)話框的調(diào)用和對(duì)視圖類(lèi)填充參數(shù)變量的賦值。添加代碼如下。#include FillParaDlg.h /包含對(duì)話框類(lèi)的頭文件void CMyDrawSystemView:OnFillParameter() /菜單命令“設(shè)置|填充參數(shù)”/ TODO: Add your command handler code hereCFillParaDlg FillParaDlg;if(FillParaDlg.DoModal() = IDOK)
24、m_nFillPattern = FillParaDlg.m_nFillPattern;m_FillColor = FillParaDlg.m_FillColor;31畫(huà)刷6. 視圖類(lèi)中保存的填充參數(shù)在建立新的CRectangle對(duì)象時(shí)要傳遞給其構(gòu)造函數(shù)。矩形類(lèi)對(duì)象的生成是在視圖類(lèi)的OnLButtonUp()函數(shù)中完成的?,F(xiàn)在修改OnLButtonUp()函數(shù)中的代碼。原來(lái)的代碼是:CRectangle *pRectangle;pRectangle = new CRectangle(m_StartPos, m_EndPos, m_nPenWidth,m_nPenType, m_PenColor
25、);pDoc-m_FigureList.AddTail(pRectangle); /將新繪制的矩形存入圖元鏈表32畫(huà)刷修改之后代碼是:CRectangle *pRectangle;pRectangle = new CRectangle(m_StartPos, m_EndPos, m_nPenWidth,m_nPenType, m_PenColor,m_nFillPattern,m_FillColor); /補(bǔ)充2個(gè)參數(shù) pDoc-m_FigureList.AddTail(pRectangle); /將新繪制的矩形存入圖元鏈表33畫(huà)刷7. 在繪制封閉圖形對(duì)象時(shí),除了需要使用根據(jù)圖形對(duì)象中保存的線
26、型參數(shù)所創(chuàng)建的新畫(huà)筆,還需要使用根據(jù)圖形對(duì)象中保存的填充參數(shù)來(lái)創(chuàng)建的新畫(huà)刷,為此我們?cè)贑Rectangle類(lèi)的基類(lèi)CFill中添加一個(gè)新的成員變量和一個(gè)新的成員函數(shù):protected: CBrush m_CurrentBrush ; /保存新畫(huà)刷參數(shù)public: void SetCurrentBrush(int brushPattern, COLORREF brushColor); 34成員函數(shù)SetCurrentBrush()用于創(chuàng)建一個(gè)新畫(huà)刷。其代碼如下。void CFill:SetCurrentBrush(int brushPattern, COLORREF brushColor)
27、/設(shè)置填充圖案和填充顏色 m_CurrentBrush.DeleteObject();switch(brushPattern)case 0: m_CurrentBrush.CreateSolidBrush(brushColor);break;case 1: m_CurrentBrush.CreateHatchBrush(HS_BDIAGONAL, brushColor);break;case 2: m_CurrentBrush.CreateHatchBrush(HS_DIAGCROSS, brushColor);break;case 3: m_CurrentBrush.CreateHatchB
28、rush(HS_FDIAGONAL, brushColor);break;case 4: m_CurrentBrush.CreateHatchBrush(HS_CROSS, brushColor);break;case 5: m_CurrentBrush.CreateHatchBrush(HS_HORIZONTAL, brushColor);break;case 6: m_CurrentBrush.CreateHatchBrush(HS_VERTICAL, brushColor);break;default: break; 35畫(huà)刷在繪制圖形之前,需要將新畫(huà)刷選入設(shè)備環(huán)境,繪制圖形之后。需要還
29、原舊畫(huà)刷。因此需要修改CRectangle類(lèi)的成員函數(shù)Draw。 36畫(huà)刷修改之后的代碼如下。void CRectangle:Draw(CDC *pDC) /繪制矩形的成員函數(shù)CPen *pPenOld;CBrush *pBrushOld; SetCurrentPen(m_nLineWidth, m_nLineType, m_LineColor);SetCurrentBrush(m_nFillPattern, m_FillColor); pPenOld = pDC-SelectObject(&m_CurrentPen); /將新畫(huà)筆選入DCpBrushOld = pDC-SelectObject(&m_CurrentBrush); /將新畫(huà)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 校長(zhǎng)新年寄語(yǔ)祝福九年級(jí)(初三)同學(xué)
- 小學(xué)考試管理制度
- 買(mǎi)賣(mài)合同(供進(jìn)口成套設(shè)備用)5篇
- 二零二五年度駕校應(yīng)急處理與安全保障合同3篇
- 第17章-第1節(jié)-總需求曲線教材課程
- 《科幻小說(shuō)賞析與寫(xiě)作》 課件 第3、4章 “太空歌劇”的探索與開(kāi)拓-《2001太空漫游》;“生命奇跡”的重述與復(fù)魅-《弗蘭肯斯坦》
- 二零二五年度網(wǎng)絡(luò)安全風(fēng)險(xiǎn)評(píng)估與維保服務(wù)合同3篇
- 2024年隴南市精神病康復(fù)醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 二零二五年度高端制造項(xiàng)目反擔(dān)保協(xié)議3篇
- 2024年陽(yáng)江市人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 浙江省金華市婺城區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末數(shù)學(xué)試卷(含答案)
- 天津市河西區(qū)2024-2025學(xué)年高二上學(xué)期1月期末英語(yǔ)試題(含答案無(wú)聽(tīng)力音頻及聽(tīng)力原文)
- 水利工程安全應(yīng)急預(yù)案
- 滬教版小學(xué)數(shù)學(xué)三(下)教案
- 2024-2025年度村支書(shū)工作述職報(bào)告范文二
- 繼電保護(hù)多選試題庫(kù)與參考答案
- 品管圈PDCA改善案例-降低住院患者跌倒發(fā)生率
- 2024年江西水利職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案解析
- 《交換機(jī)基本原理》課件
- 向電網(wǎng)申請(qǐng)光伏容量的申請(qǐng)書(shū)
- 人教版物理八年級(jí)下冊(cè) 專(zhuān)項(xiàng)訓(xùn)練卷 (一)力、運(yùn)動(dòng)和力(含答案)
評(píng)論
0/150
提交評(píng)論