




已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
MFC編程及應(yīng)用課程設(shè)計(jì)報(bào)告題目: 簡(jiǎn)單畫圖形程序 學(xué)號(hào): 姓名: 指導(dǎo)老師: 時(shí)間: 評(píng)語:程序設(shè)計(jì)步驟:一、 建立基于對(duì)話框的應(yīng)用程序框架;二、 CMy0910200155Dlg類中關(guān)鍵新增變量的作用:CPtrArray pta; /用于保存已繪圖形的相關(guān)信息。CMemoryNode *pmN; /指向CMemoryNode類的指針,程序運(yùn)行過程中動(dòng)態(tài)保存對(duì)象信息。CMemoryNode *pmn; /指向CMemoryNode類的指針,從文件中讀取信息時(shí)動(dòng)態(tài)創(chuàng)建類的對(duì)象。 COLORREF m_CurrentBrushColor; /用于存放當(dāng)前畫刷的顏色。COLORREF m_CurrentPenColor; /用于存放當(dāng)前畫筆的顏色。int num; / 用于存放從Index.txt文件中讀取的數(shù)字。int flag=0; /用于標(biāo)識(shí):當(dāng)為1時(shí),表示按下了”畫圖”按鈕;當(dāng)為2時(shí),表示按下了”撤消”按鈕;當(dāng)為3時(shí),表示按下了”加載歷史”按鈕,則從文件中讀取信息。int mark; /用于標(biāo)識(shí):當(dāng)為0時(shí),表示剛畫過矩形;當(dāng)為1時(shí),表示剛畫過圓角矩形;當(dāng)為2時(shí),表示剛畫過橢圓。int index; /用于存放pta數(shù)組的容量。int flag1=0; /用于標(biāo)識(shí),和flag搭配,用來處理多種情況下的窗口重繪問題。int ButtonState=0; /用于標(biāo)識(shí),是類CShow和類CMy0910200155Dlg的一個(gè)接口,通過其值在1和0之間轉(zhuǎn)換,來處理彈出式對(duì)話框的初次繪制和移動(dòng)時(shí)的重繪問題。三、 CMemoryNode類中變量的作用:COLORREF BrushColor; COLORREF PenColor; int Mark;/以上三者為類CMemoryNode的成員變量,分別用來保存繪圖時(shí)畫刷顏色,畫筆顏色和形狀。四、 與控件相關(guān)聯(lián)的變量:CComboBox m_BrushColor; /指示畫刷顏色組合框。CComboBox m_PenColor; /指示畫筆顏色組合框。 CListBox m_Shape; /指示形狀列表框。五、 應(yīng)用程序功能的具體實(shí)現(xiàn):1) 初始化過程:this-m_Shape.AddString(矩形); /給形狀列表框添加一個(gè)項(xiàng)目。this-m_PenColor.AddString(紅色); /給畫筆顏色框添加一個(gè)項(xiàng)目。this-m_BrushColor.AddString(白色); /給畫刷顏色框添加一個(gè)項(xiàng)目。(剩余項(xiàng)目的添加方法完全相同,就不再贅述了) m_PenColor.SetCurSel(0); m_BrushColor.SetCurSel(4); m_Shape.SetCurSel(2); /設(shè)置光標(biāo)初始定位。 m_CurrentBrushColor=RGB(0,0,255); /畫刷顏色設(shè)置默認(rèn)初值為藍(lán)色。 m_CurrentPenColor=RGB(255,0,0); /畫筆顏色設(shè)置默認(rèn)初值為紅色。 this-SetWindowText(簡(jiǎn)單畫圖形程序); /設(shè)置窗口標(biāo)題。 RECT rect; this-GetWindowRect(&rect); /得到窗體的大小。 CRgn rgn;rgn.CreateRoundRectRgn(rect.left+3,rect.top+5,rect.right-2,rect.bottom-2,40,40); this-SetWindowRgn(HRGN)rgn.GetSafeHandle(),TRUE); /按要求繪制圓角矩形的窗體。ifstream infile1(Index.txt,ios:nocreate);if(!infile1) this-GetDlgItem(IDC_BUTTON_LOAD)-EnableWindow(FALSE); /通過Index.txt文件是否存在來決定”加載歷史”按鈕的狀態(tài),如果存在則可用,否則不可用。2) 窗口繪制過程:此過程調(diào)用OnPaint()函數(shù),涉及多種情況下的圖形繪制和窗口重繪,是相對(duì)比較核心的部分,將在后面具體逐個(gè)分析。六、 從某一次程序運(yùn)行的角度說明各個(gè)函數(shù)的功能:首先打開應(yīng)用程序,系統(tǒng)將自動(dòng)創(chuàng)建窗體,在窗體彈出的一瞬間,你會(huì)發(fā)現(xiàn)窗體是圓角形的,其次感覺顏色比較柔和。這歸功于初始化中的:RECT rect; this-GetWindowRect(&rect); CRgn rgn;rgn.CreateRoundRectRgn(rect.left+3,rect.top+5,rect.right-2,rect.bottom-2,40,40); this-SetWindowRgn(HRGN)rgn.GetSafeHandle(),TRUE); /繪制圓角矩形的窗體。和應(yīng)用類初始化中添加的:SetDialogBkColor(RGB(80,80,180),RGB(0,0,0); /設(shè)置窗體顏色。如果是第一次使用該程序,那么你將看到”加載歷史”按鈕是灰化的,不能使用,這是因?yàn)槌跏蓟惺褂昧嗽撜Z句,ifstream infile1(Index.txt,ios:nocreate);if(!infile1) this-GetDlgItem(IDC_BUTTON_LOAD)-EnableWindow(FALSE); 沒有創(chuàng)建過Index.txt文件,當(dāng)然無法讀?。?將已有的Index.txt文件刪除,然后重新啟動(dòng)系統(tǒng),會(huì)有相同的效果。你會(huì)看到窗口中”形狀”,”畫筆顏色”,”填充顏色” 分別默認(rèn)為”圓角矩形”,”紅色”,”藍(lán)色”,這是因?yàn)樵诔跏蓟^程中,已經(jīng)對(duì)相應(yīng)的變量賦值,而且設(shè)置了光標(biāo)選擇:m_PenColor.SetCurSel(0); m_BrushColor.SetCurSel(4); m_Shape.SetCurSel(2); /設(shè)置光標(biāo)初始定位。 m_CurrentBrushColor=RGB(0,0,255); /畫刷顏色設(shè)置默認(rèn)初值為藍(lán)色。 m_CurrentPenColor=RGB(255,0,0); /畫筆顏色設(shè)置默認(rèn)初值為紅色。 如果我們想畫一個(gè)邊框?yàn)檠蠹t色,填充色為青色的圓角矩形,那么當(dāng)鼠標(biāo)點(diǎn)擊”畫筆顏色”下的”洋紅”時(shí),將觸發(fā)組合框IDC_COMBO_PEN_COLOR的CBN_SELENDOK消息,將調(diào)用,void CMy0910200155Dlg:OnSelendokComboPenColor() int n=m_PenColor.GetCurSel(); switch(n) case 0:m_CurrentPenColor=RGB(255,0,0);break; case 1:m_CurrentPenColor=RGB(0,255,0);break; case 2:m_CurrentPenColor=RGB(0,0,255);break; case 3:m_CurrentPenColor=RGB(255,255,0);break; case 4:m_CurrentPenColor=RGB(255,0,255);break; case 5:m_CurrentPenColor=RGB(0,255,255);break; default:m_CurrentPenColor=RGB(0,0,0);break; 同理可知,當(dāng)鼠標(biāo)點(diǎn)擊”填充顏色”下的”青色”時(shí),將觸發(fā)組合框IDC_COMBO_BRUSH_COLOR的CBN_SELENDOK消息,將調(diào)用,void CMy0910200155Dlg:OnSelendokComboBrushColor() int n=m_BrushColor.GetCurSel(); switch(n) case 6:m_CurrentBrushColor=RGB(255,0,0);break; case 5:m_CurrentBrushColor=RGB(0,255,0);break; case 4:m_CurrentBrushColor=RGB(0,0,255);break; case 3:m_CurrentBrushColor=RGB(255,255,0);break; case 2:m_CurrentBrushColor=RGB(255,0,255);break; case 1:m_CurrentBrushColor=RGB(0,255,255);break; default:m_CurrentBrushColor=RGB(255,255,255);break; 這兩個(gè)函數(shù)能將光標(biāo)的選擇轉(zhuǎn)換為畫筆或畫刷的顏色。不過,當(dāng)然必須先給組合框添加過一個(gè)CBN_SELENDOK消息!然后點(diǎn)擊”形狀”下的”圓角矩形”,這時(shí)this-m_Shape.GetSel(1)其值為TRUE,表明”圓角矩形”被選中了,當(dāng)然,其它兩個(gè)m_Shape.GetSel(0)和m_Shape.GetSel(2)都為FALSE。在畫圖前,如果你足夠細(xì)心,你會(huì)注意到剛才在選顏色時(shí),如果顏色還沒有選定,它周圍就會(huì)有一個(gè)當(dāng)前顏色的色圈,而當(dāng)顏色已選定時(shí),色圈就會(huì)變?yōu)椴噬尘?,這是因?yàn)橹敖o類CMy0910200155Dlg添加了WM_CTLCOLOR消息,因此當(dāng)觸發(fā)該消息時(shí),會(huì)調(diào)用,HBRUSH CMy0910200155Dlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor);if(pWnd-GetDlgCtrlID()=IDC_COMBO_PEN_COLOR) hbr=:CreateSolidBrush(this-m_CurrentPenColor); pDC-SetBkColor(this-m_CurrentPenColor); if(pWnd-GetDlgCtrlID()=IDC_COMBO_BRUSH_COLOR) hbr=:CreateSolidBrush(this-m_CurrentBrushColor); pDC-SetBkColor(this-m_CurrentBrushColor); return hbr;該方法可以實(shí)現(xiàn)控件顏色的改變,考慮到界面的簡(jiǎn)潔(不是簡(jiǎn)單)和色彩協(xié)調(diào),其它控件的顏色就不必改變了。做好了這些準(zhǔn)備工作,現(xiàn)在我們開始繪圖,點(diǎn)擊”繪圖”按鈕,就觸發(fā)了IDC_BUTTON_DRAW的BN_CLICKED消息,會(huì)調(diào)用,void CMy0910200155Dlg:OnButtonDraw() flag=1;flag1=1;OnPaint();this-GetDlgItem(IDC_BUTTON_LOAD)-EnableWindow(FALSE);在這里,我們只將flag=1和flag1=1條件下的OnPaint()函數(shù)展開(系統(tǒng)自己生成的代碼我們略去),if(indexGetDlgItem(IDC_BUTTON_CLEAN)-EnableWindow(FALSE); /根據(jù)判斷確定”撤消”按鈕的狀態(tài),若繪圖區(qū)沒有圖形,則其失效。if(flag=1|flag=2|flag=3) CClientDC dc(this); CPen pNewPen1; pNewPen1.CreatePen(PS_SOLID,2,RGB(80,80,180);CPen *pOldPen1=dc.SelectObject(&pNewPen1);CBrush pNewBrush1; pNewBrush1.CreateSolidBrush(RGB(80,80,180); CBrush *pOldBrush1=dc.SelectObject(&pNewBrush1); CRect rect1;this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect1);this-ScreenToClient(&rect1);CRect draw1(rect1.left+3,rect1.top+9,rect1.right-2,rect1.bottom-2);dc.Rectangle(draw1);dc.SelectObject(pOldPen1);dc.SelectObject(pOldBrush1); /此為所有情況下的公用部分,將繪圖區(qū)繪為背景色。if(flag=1|flag=3)if(flag=3) this-m_CurrentPenColor=pmn-PenColor; this-m_CurrentBrushColor=pmn-BrushColor; int mark=pmn-Mark;CPen pNewPen; pNewPen.CreatePen(PS_SOLID,2,this-m_CurrentPenColor);CPen *pOldPen=dc.SelectObject(&pNewPen);CBrush pNewBrush; pNewBrush.CreateSolidBrush(this-m_CurrentBrushColor); CBrush *pOldBrush=dc.SelectObject(&pNewBrush);CRect rect; this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect);this-ScreenToClient(&rect);CRect draw(rect.left+3,rect.top+9,rect.right-2,rect.bottom-2); this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect); this-ScreenToClient(&rect);CRect draw(rect.left+3,rect.top+9,rect.right-2,rect.bottom-2);if(flag=1) if(this-m_Shape.GetSel(0) dc.Rectangle(draw);mark=0; else if(this-m_Shape.GetSel(1) dc.RoundRect(draw,CPoint(100,100);mark=1; else dc.Ellipse(draw);mark=2;if(flag=3)switch(mark) case 0:dc.Rectangle(draw);break; case 1:dc.RoundRect(draw,CPoint(100,100);break;default:dc.Ellipse(draw);break;dc.SelectObject(pOldPen);dc.SelectObject(pOldBrush);this-GetDlgItem(IDC_BUTTON_CLEAN)-EnableWindow(TRUE);if(flag=1&flag1=1)pmN=new CMemoryNode(m_CurrentPenColor,m_CurrentBrushColor,mark); pta.Add(pmN); OnFileWrite(); flag1=0; /用當(dāng)前所選畫筆,畫刷和圖形繪圖。 其實(shí),當(dāng)點(diǎn)擊”繪圖”按鈕時(shí),只是先用背景色的畫筆和刷子把繪圖區(qū)重繪一遍,然后再用當(dāng)前所選畫筆,刷子和圖形繪圖,同時(shí)將當(dāng)前的繪圖信息保存在pta數(shù)組中和寫入到文件中。 現(xiàn)在,請(qǐng)仔細(xì)看一下最后一句flag1=0;,它的作用很大,它解決了當(dāng)點(diǎn)擊繪圖按鈕,繪出圖形后,移動(dòng)窗口時(shí)圖形信息的重復(fù)保存和文檔的重復(fù)書寫問題。沒有它,程序雖然可以正常運(yùn)行,但當(dāng)從文件中讀取信息后,運(yùn)行結(jié)果和預(yù)想很有出入! 點(diǎn)擊”繪圖按鈕”后,”載入歷史”按鈕將不能使用,這就限定了這個(gè)按鈕只能在程序的開始使用,而且只能使用一次。 在上面提到了將繪圖信息寫入到文件中,那么下面看看這個(gè)寫文件的函數(shù), void CMy0910200155Dlg:OnFileWrite() int sum=pta.GetSize(); /已畫圖形的個(gè)數(shù),即點(diǎn)擊”繪圖”按鈕的次數(shù)。 ofstream outfile; ofstream outfile1; outfile.open(Histories.txt,ios:app); /添加式書寫。 outfile1.open(Index.txt); /覆蓋式書寫。 if(!outfile|!outfile1) MessageBox(數(shù)據(jù)無法保存!); else outfilem_CurrentPenColort; outfilem_CurrentBrushColort; outfilemarkendl; outfile1sumpta.GetUpperBound(); OnPaint(); 仿照前面的方式,為了更好表現(xiàn)出函數(shù)的功能,將flag=2和flag1=2條件下的OnPaint()函數(shù)完全地展開(和其它情況的公用部分省略),if(flag=2) if(index=0) CPen pNewPen; pNewPen.CreatePen(PS_SOLID,2,RGB(80,80,180); CPen *pOldPen=dc.SelectObject(&pNewPen); CBrush pNewBrush; pNewBrush.CreateSolidBrush(RGB(80,80,180); CBrush *pOldBrush=dc.SelectObject(&pNewBrush);CRect rect; this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect); this-ScreenToClient(&rect); CRect draw(rect.left+3,rect.top+9,rect.right-2,rect.bottom-2); dc.Rectangle(draw); dc.SelectObject(pOldPen); dc.SelectObject(pOldBrush); /當(dāng)撤消完全時(shí),只需重繪繪圖區(qū)即可。 if(index0) CMemoryNode *pmN; pmN=(CMemoryNode *)pta.GetAt(index-1); CPen pNewPen1; pNewPen1.CreatePen(PS_SOLID,2,RGB(80,80,180); CPen *pOldPen1=dc.SelectObject(&pNewPen1); CBrush pNewBrush1; pNewBrush1.CreateSolidBrush(RGB(80,80,180); CBrush *pOldBrush1=dc.SelectObject(&pNewBrush1);CRect rect1;this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect1); this-ScreenToClient(&rect1); CRect draw1(rect1.left+3,rect1.top+9,rect1.right-2,rect1.bottom-2); dc.Rectangle(draw1); dc.SelectObject(pOldPen1); dc.SelectObject(pOldBrush1); CPen pNewPen; pNewPen.CreatePen(PS_SOLID,2,pmN-PenColor); CPen *pOldPen=dc.SelectObject(&pNewPen); CBrush pNewBrush; pNewBrush.CreateSolidBrush(pmN-BrushColor); CBrush *pOldBrush=dc.SelectObject(&pNewBrush); CRect rect; this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect); this-ScreenToClient(&rect); CRect draw(rect.left+3,rect.top+9,rect.right-2,rect.bottom-2); if(pmN-Mark=0) dc.Rectangle(draw); else if(pmN-Mark=1) dc.RoundRect(draw,CPoint(100,100); else dc.Ellipse(draw); dc.SelectObject(pOldPen); dc.SelectObject(pOldBrush); if(flag1=2) this-pta.RemoveAt(index-1); flag1=0; 雖然有些冗長(zhǎng),但可以清晰地看出撤消的思路也是先用背景色的畫筆和刷子把繪圖區(qū)重繪一遍,然后調(diào)用上一次的繪圖信息,重新”復(fù)原”圖形。 最后的if語句,用flag1=2作為判斷條件,并最后置flag1=0;,很好地區(qū)分了點(diǎn)擊”撤消”按鈕與點(diǎn)擊后窗口的移動(dòng),避免了窗口重繪時(shí)的”重復(fù)撤消”。 下面點(diǎn)擊”版權(quán)聲明”按鈕,這時(shí)將會(huì)調(diào)用, void CMy0910200155Dlg:OnButtonShow() CShow dlg;ButtonState=1; dlg.DoModal();這里面用到了一個(gè)標(biāo)識(shí)性變量,int ButtonState,它被聲明為類CShow的一個(gè)外部變量,我認(rèn)為在某方面它起到了一個(gè)接口的作用。當(dāng)這個(gè)對(duì)話框被創(chuàng)建時(shí),自然要調(diào)用CShow類的OnPaint()函數(shù),其代碼為,void CShow:OnPaint() CPaintDC dc(this); extern ButtonState; if(ButtonState=1) CRect rect; this-GetClientRect(&rect); this-ScreenToClient(&rect); for(int j=3;j=1;j-) for(int i=1;iGetClientRect(&rect); this-ScreenToClient(&rect); for(int j=3;j=1;j-) for(int i=1;inum; index=num; this-GetDlgItem(IDC_BUTTON_CLEAN)-EnableWindow(TRUE); OnFileRead(); this-GetDlgItem(IDC_BUTTON_LOAD)-EnableWindow(FALSE);文件加載后就有東西可操作,所以”撤消”按鈕就可用。這里提到了從文件中讀取數(shù)據(jù),我們就來看看它,void CMy0910200155Dlg:OnFileRead() ifstream infile(Histories.txt,ios:nocreate); if(!infile) MessageBox(文件不存在或不完整,無法讀取!); this-GetDlgItem(IDC_BUTTON_CLEAN)-EnableWindow(FALSE); int Mark; COLORREF BrushColor; COLORREF PenColor; for(int i=0;infile;i+) infilePenColor;infileBrushColor;infileMark;m_CurrentPenColor=PenColor; m_CurrentBrushColor=BrushColor; switch(Mark)case 0:m_Shape.GetSel(0);break;case 1:m_Shape.GetSel(1);break;default:m_Shape.GetSel(2);break;pmn=new CMemoryNode(PenColor,BrushColor,Mark);pta.Add(pmn);flag=3; OnPaint(); infile.close();這里是用C+的文件輸入流來讀取數(shù)據(jù)的,讀取出的數(shù)據(jù),以對(duì)象的形式保存在數(shù)組pta中。其后又調(diào)用了OnPaint()函數(shù),同樣,我們繼續(xù)將flag=3時(shí)的這一函數(shù)展開(共用部分省略),if(flag=1|flag=3)if(flag=3) this-m_CurrentPenColor=pmn-PenColor; this-m_CurrentBrushColor=pmn-BrushColor; int mark=pmn-Mark;CPen pNewPen; pNewPen.CreatePen(PS_SOLID,2,this-m_CurrentPenColor);CPen *pOldPen=dc.SelectObject(&pNewPen);CBrush pNewBrush; pNewBrush.CreateSolidBrush(this-m_CurrentBrushColor); CBrush *pOldBrush=dc.SelectObject(&pNewBrush);CRect rect; this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect);this-ScreenToClient(&rect);CRect draw(rect.left+3,rect.top+9,rect.right-2,rect.bottom-2); this-GetDlgItem(IDC_DRAW_PLACE)-GetWindowRect(&rect); this-ScreenToClient(&rect);CRect draw(rect.left+3,rect.top+9,rect.right-2,rect.bottom-2);if(flag=1) if(this-m_Shape.GetSel(0) dc.Rectangle(draw);mark=0; else if(this-m_Shape.GetSel(1) dc.RoundRect(draw,CPoint(100,100);mark=1; else dc.Ellipse(draw);mark=2;if(flag=3)switch(mark) case 0:dc.Rectangle(draw);break; case 1:dc.RoundRect(draw,CPoint(100,100);break;default:dc.Ellipse(draw);break;dc.SelectObject(pOldPen);dc.SelectObject(pOldBrush);this-GetDlgItem(IDC_BUTTON_CLEAN)-EnableWindow(TRUE);同樣也可以看出,載入信息時(shí),也是先用背景色的畫筆和畫刷將繪圖區(qū)刷一遍,然后顯示最近一次繪制的圖形。至此,整個(gè)應(yīng)用程序的功能基本介紹完,其功能的實(shí)現(xiàn)思想及源代碼也已經(jīng)能夠清晰。其中主要是用了flag和flag1的組合來表示應(yīng)該執(zhí)行的程序:flag=1,flag1=1時(shí),繪圖按鈕被點(diǎn)擊,繪圖并且寫文件;flag=1,flag1=0時(shí),確保繪圖按鈕被點(diǎn)擊過后,窗口重繪時(shí)不重寫文件;flag=2,flag1=2時(shí),撤消按鈕被點(diǎn)擊,實(shí)現(xiàn)撤消效果;flag=2,flag1=0時(shí),確保撤消按鈕被點(diǎn)擊過后,窗口重繪時(shí)不重復(fù)撤消;flag=3時(shí),加載歷史按鈕被點(diǎn)擊,負(fù)責(zé)加載后圖形的繪制與顯示。七、 遇到的問題及解決辦法:1)在編程過程中,遇到的最多的和最主要的問題就是窗口的重繪問題,往往感覺一切都好了時(shí),一次偶然的機(jī)會(huì),才發(fā)現(xiàn)只要窗口一移動(dòng),窗口中繪出的圖像就全都沒了,通過很多次的嘗試與反復(fù)修改,問題解決了。在主對(duì)話框中,主要是通過flag和flag1的組合來解決的:在未解決之前,只有flag一個(gè)變量標(biāo)識(shí),當(dāng)時(shí)大致是這樣的:flag=1,表明”繪圖”按鈕被按下,然后執(zhí)行繪圖程序;flag=2,表示”撤消”按鈕被按下,然后執(zhí)行撤消;以上執(zhí)行完后,都將flag置為初值0,現(xiàn)在看來這是最錯(cuò)的地方,這種做法肯定會(huì)使重畫時(shí)失??!后來增加了一個(gè)變量flag1,用兩個(gè)變量的組合表示會(huì)出現(xiàn)的各種情況,基本如下:flag=2,flag1=2時(shí),表明”撤消”按鈕被點(diǎn)擊,實(shí)現(xiàn)撤消效果;flag=2,flag1=0時(shí),確保”撤消”按鈕被點(diǎn)擊過后,窗口重繪時(shí)不重復(fù)撤消;flag=3時(shí),表明”加載歷史”按鈕被點(diǎn)擊,負(fù)責(zé)加載后圖形的繪制與顯示。在點(diǎn)擊”版權(quán)聲明”按鈕后的彈出式的對(duì)話框中,是通過ButtonStat的標(biāo)識(shí)來實(shí)現(xiàn)的,其值只有在點(diǎn)擊”版權(quán)聲明”按鈕時(shí)才為1,其余時(shí)間均為0。其實(shí)問題也最先是在這里發(fā)現(xiàn)的,當(dāng)時(shí)的OnPaint()源代碼只有前面提到的第一部分,每次移動(dòng)窗口時(shí)都得重畫好久,而且位于它下方的主對(duì)話框鐘會(huì)的圖形也會(huì)被部分地擦掉。2)其次是關(guān)于文件的寫入和讀出問題,尤其是有一段時(shí)間,無論怎么,都看不出自己的程序出了什么問題,因?yàn)榫幾g完全能通過,而且可以正常運(yùn)行,但結(jié)果與我預(yù)想的還是有一定的出入,而且這種出入還似乎是有規(guī)律的。經(jīng)過幾天的琢磨,反復(fù)嘗試與修改,終于在解決窗口重繪問題時(shí)一起解決了,原來在移動(dòng)窗口導(dǎo)致窗口重繪時(shí),都會(huì)重復(fù)的寫入一組相同的數(shù)據(jù),即當(dāng)前的繪圖信息。在解決之前,只有一個(gè)flag變量標(biāo)識(shí),當(dāng)flag=1時(shí),繪圖并寫文件,而每次重繪時(shí)都會(huì)使用相同的代碼,所以就重復(fù)寫文件;后來聯(lián)系窗口的重繪問題,新加了一個(gè)變量flag1與flag共同標(biāo)識(shí),問題就迎刃而解,基本如下:flag=1,flag1=1時(shí),表明”繪圖”按鈕被點(diǎn)擊,繪圖并且寫文件;flag=1,flag1=0時(shí),確保”繪圖”按鈕被點(diǎn)擊過后,窗口重繪時(shí)不重寫文件;3)是在編程之初,還不是非常習(xí)慣于MFC的這種機(jī)制與實(shí)現(xiàn)方式,有一些關(guān)系沒有完全搞清楚,常常不知道通過什么方式實(shí)現(xiàn)自己想要實(shí)現(xiàn)的功能,什么時(shí)候該定義函數(shù),什么時(shí)候又該創(chuàng)建新類經(jīng)常有種無從下手的感覺。通過翻閱大量的書本,上搞清了一些常用的處理方式,而且學(xué)到了一些編程技巧,同時(shí)通過聯(lián)系實(shí)際現(xiàn)象與問題,感覺自己對(duì)MFC編程有了更深層次的認(rèn)識(shí)和體會(huì)。4)還有一些其它類型的問題,基本上通過查閱相關(guān)書籍都可
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 落實(shí)安全管理措施
- 新時(shí)期市民熱線數(shù)智化改革的模式創(chuàng)新研究
- 2025至2030生物殺蟲劑行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 縣城區(qū)排水防澇整治項(xiàng)目可行性研究報(bào)告
- 2025至2030中國(guó)汽車金融行業(yè)市場(chǎng)深度調(diào)研及發(fā)展戰(zhàn)略與投資前景報(bào)告
- 2025至2030中國(guó)木耳行業(yè)發(fā)展分析及競(jìng)爭(zhēng)策略與趨勢(shì)預(yù)測(cè)報(bào)告
- 2025至2030中國(guó)智能皂液器行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030中國(guó)智能渣土車行業(yè)深度研究及發(fā)展前景投資評(píng)估分析
- 2025至2030中國(guó)智能地磚找平系統(tǒng)行業(yè)市場(chǎng)深度研究及發(fā)展前景投資可行性分析報(bào)告
- 熟食攤位義賣活動(dòng)方案
- 中國(guó)硒化汞行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭(zhēng)格局與投資發(fā)展研究報(bào)告2024-2029版
- 水庫安保服務(wù)方案
- INSAR技術(shù)在城市地面沉降監(jiān)測(cè)中的應(yīng)用
- 產(chǎn)品審核VDA6.5培訓(xùn)課件
- 艾滋病乙肝梅毒知識(shí)講座
- 九年級(jí)化學(xué)下冊(cè) 第11單元 課題2 化學(xué)肥料課件 新人教版
- 暖氣片報(bào)價(jià)單范本
- 臨床醫(yī)學(xué)研究中心年度考核細(xì)則
- PSSE軟件操作說明
- 22S803 圓形鋼筋混凝土蓄水池
- 級(jí)配碎石試驗(yàn)段施工總結(jié)報(bào)告
評(píng)論
0/150
提交評(píng)論