




已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
例程1. MFChello步驟1.選擇新建-項(xiàng)目,打開后出現(xiàn)如果1所示對(duì)話框。選擇VC+中的智能設(shè)備,在右邊選擇MFC智能設(shè)備應(yīng)用程序。在下方的名稱中輸入MFChello,點(diǎn)擊確定。步驟2.點(diǎn)擊下一步步驟3.將Mini2440-CE6-SDK移到右邊,點(diǎn)擊下一步。步驟4.在應(yīng)用程序類型選擇基于對(duì)話框,直接點(diǎn)擊完成。步驟5.選擇類視圖,點(diǎn)擊CMFChelloApp,在下方可以看到InitInstance(void)函數(shù),雙擊該函數(shù)。步驟6在BOOL CMFChelloApp:InitInstance()添加如下代碼AfxEnableControlContainer(); /調(diào)用此函數(shù)的目的是為了使程序支持包含OLE控件MessageBox(NULL,_T(一個(gè)簡(jiǎn)單的MFC程序),_T(你好),MB_OK); /談出對(duì)話框例程2.鼠標(biāo)測(cè)試程序同例程1一樣,建立一個(gè)基于對(duì)話框的MouseTest程序。在右邊的對(duì)話框編輯器中選擇Static Text,添加到對(duì)話框中一個(gè)靜態(tài)文本,然后更改右下角的靜態(tài)文本的屬性,Caption改為提示:點(diǎn)一下鼠標(biāo)右鍵或左鍵,ID改為IDC_STATIC點(diǎn)擊對(duì)話框,在右下角點(diǎn)擊消息按鈕,出現(xiàn)下圖。找到WM_LBUTTONDOWN消息,添加OnLButtonDown函數(shù)。在函數(shù)中添加代碼如下MessageBox(NULL,_T(你點(diǎn)的是左鍵),_T(The first Dialog),MB_OK);同樣操作在WM_RBUTTONDOWN消息,添加OnRButtonDown函數(shù)。在函數(shù)中添加代碼如下MessageBox(NULL,_T(你點(diǎn)的是右鍵),_T(The first Dialog),MB_OK);進(jìn)行仿真即可。例程3.添加圖標(biāo)創(chuàng)建一個(gè)基于對(duì)話框的IconTest程序。切換到資源視圖。右鍵點(diǎn)擊Icon,選擇添加資源,彈出下圖。選擇導(dǎo)入,導(dǎo)入一個(gè)圖標(biāo)文件(.ico)文件,如下圖。點(diǎn)擊CIconTestDlg類,找到CIconTestDlg函數(shù)。找到下面的語(yǔ)句:m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);改為下面的語(yǔ)句:m_hIcon = AfxGetApp()-LoadIcon(IDI_ICON1);點(diǎn)擊仿真可看到對(duì)話框左上角的圖標(biāo)已經(jīng)改變。例程4.簡(jiǎn)單計(jì)算機(jī)1.0創(chuàng)建基于對(duì)話框的calculator項(xiàng)目。點(diǎn)擊Dialog,添加如下控件。在加數(shù)編輯框右擊添加變量。變量名稱是m_editSummand,變量類型是double,類別為value。同樣操作添加被加數(shù)編輯框變量。變量名稱是m_editAddend,變量類型是double,類別為value。和編輯框變量。變量名稱是m_editSum,變量類型是double,類別為value。將計(jì)算按鈕的ID設(shè)為IDC_ADDBUTTON。雙擊該按鈕,進(jìn)入void CcalculatorDlg:OnBnClickedAddbutton()函數(shù)。添加如下代碼:UpdateData(TRUE);m_editSum = m_editSummand + m_editAddend;UpdateData(FALSE);將退出按鈕的ID設(shè)為IDC_QUT。雙擊該按鈕,進(jìn)入void CcalculatorDlg:OnBnClickedQut()函數(shù)。添加如下代碼:ShowWindow(SW_HIDE);/將非模態(tài)對(duì)話框隱藏仿真即可。在這個(gè)程序中對(duì)話框基本是由MFC自己創(chuàng)立的,下面說(shuō)一下它是在哪里彈出的。打開calculator.cpp文件,可以看到有個(gè)InitInstance()函數(shù)。對(duì)話框就是在這里產(chǎn)生的。下面是這段代碼的注釋程序。BOOL CcalculatorApp:InitInstance()/ 標(biāo)準(zhǔn)初始化/ 如果未使用這些功能并希望減小/ 最終可執(zhí)行文件的大小,則應(yīng)移除下列/ 不需要的特定初始化例程/ 更改用于存儲(chǔ)設(shè)置的注冊(cè)表項(xiàng)/ TODO: 應(yīng)適當(dāng)修改該字符串,/ 例如修改為公司或組織名SetRegistryKey(_T(應(yīng)用程序向?qū)傻谋镜貞?yīng)用程序);CcalculatorDlg dlg; /定義對(duì)話框類CcalculatorDlg的對(duì)象m_pMainWnd = &dlg; /將dlg設(shè)為主窗口INT_PTR nResponse = dlg.DoModal(); /彈出對(duì)話dlg,并將DoModal函數(shù)的返回值(退出時(shí)點(diǎn)擊/按鈕的ID)賦值給nResponseif (nResponse = IDOK) /判斷返回值是否為OK按鈕/ TODO: 在此處放置處理何時(shí)用“確定”來(lái)關(guān)閉/ 對(duì)話框的代碼 Else if(nResponse = IDCANCEL) /判斷返回值是否為Cancel按鈕 / 由于對(duì)話框已關(guān)閉,所以將返回FALSE 以便退出應(yīng)用程序,/ 而不是啟動(dòng)應(yīng)用程序的消息泵。return FALSE;彈出對(duì)話框比較關(guān)鍵的一個(gè)函數(shù),就是對(duì)話框類的DoModal()函數(shù)。CDialog:DoModal()函數(shù)的原型為: Virtual INT_PTR DoModal(); 返回值:整數(shù)值,指定了傳遞給CDialog:EndDialog(該函數(shù)用于關(guān)閉對(duì)話框)的nResult函數(shù)值。如果函數(shù)不能創(chuàng)建對(duì)話框,則返回-1;如果出現(xiàn)其他錯(cuò)誤,則返回IDABORT。調(diào)用了它對(duì)話框就會(huì)彈出,返回值是退出對(duì)話框時(shí)所點(diǎn)的按鈕的ID,比如,我們點(diǎn)了“退出”按鈕,那么DoModal返回值為IDCANCEL。添加一個(gè)新的對(duì)話框并彈出它切換到資源視圖,右擊Dialog,選擇插入Dialog,將新插入的Dialog的ID改為IDD_TIP_DIALOG,添加一個(gè)靜態(tài)文本。如下圖右擊該對(duì)話框,選擇添加類,類的名字為CTipDlg,點(diǎn)OK。在calculator.cpp中添加頭文件:#include “TipDlg.h”.修改void CcalculatorDlg:OnBnClickedAddbutton(),代碼如下INT_PTR nRes; /用于保存DoModal函數(shù)的返回值CTipDlg tipDlg; /構(gòu)造對(duì)話框類CTipDlg的實(shí)例nRes = tipDlg.DoModal(); /彈出對(duì)話框if(IDCANCEL = nRes) /判斷對(duì)話框退出后返回值是否為IDCANCEL,如果是則return,否則繼續(xù)return;仿真即可。創(chuàng)建及顯示非模態(tài)對(duì)話框的步驟1.在calculatorDlg.h中包含CTipDlg類型的指針成員變量。詳細(xì)操作方法是,在calculatorDlg.cpp中刪除之前添加的#include”TipDlg.h”,而在calculatorDlg.h中添加#include” TipDlg.h”,這是因?yàn)槲覀冃枰赾alculatorDlg.h中定義CTipDlg類型的指針變量,所以要先包含它的頭文件,然后再calculatorDlg.h中為CcalculatorDlg類添加private成員變量CTipDlg *m_pTipDlg.2.在CcalculatorDlg類的構(gòu)造函數(shù)中初始化成員變量m_pTipDlg。如果cpp文件中函數(shù)太多,我們可以在Class View上半個(gè)視圖中找到CcalculatorDlg類,再在下半個(gè)視圖中找到其構(gòu)造函數(shù)雙擊,中間客戶區(qū)域即可馬上切換到構(gòu)造函數(shù)的實(shí)現(xiàn)處。在構(gòu)造函數(shù)中添加m_pTipDlg=NULL;。在任何指針變量使用前都初始化,可以避免因誤訪問(wèn)重要內(nèi)存地址而破壞此地址的數(shù)據(jù)。3.將上面添加模態(tài)對(duì)話框顯示代碼注釋掉。修改CcalculatorDlg:OnBnClickedAddbutton()函數(shù)。void CcalculatorDlg:OnBnClickedAddbutton()/ TODO: 在此添加控件通知處理程序代碼/*INT_PTR nRes; /用于保存DoModal函數(shù)的返回值CTipDlg tipDlg; /構(gòu)造對(duì)話框類CTipDlg的實(shí)例nRes = tipDlg.DoModal(); /彈出對(duì)話框if(IDCANCEL = nRes) /判斷對(duì)話框退出后返回值是否為IDCANCEL,如果是則return,否則繼續(xù)return;*/if(NULL=m_pTipDlg)/創(chuàng)建非模態(tài)對(duì)話框?qū)嵗齧_pTipDlg = new CTipDlg();m_pTipDlg-Create(IDD_TIP_DIALOG,this);/顯示非模態(tài)對(duì)話框m_pTipDlg-ShowWindow(SW_SHOW);/將各控件中的數(shù)據(jù)保存到相應(yīng)的變量UpdateData(TRUE);m_editSum = m_editSummand + m_editAddend;UpdateData(FALSE);4.因?yàn)榇朔悄B(tài)對(duì)話框?qū)嵗莿?dòng)態(tài)創(chuàng)建的,所以需要手動(dòng)刪除此動(dòng)態(tài)對(duì)象來(lái)銷毀對(duì)話框。我們?cè)贑calculatorDlg類的析構(gòu)函數(shù)中添加刪除代碼,但是MFC并沒有自動(dòng)給出析構(gòu)函數(shù),這時(shí)需要手動(dòng)添加,在對(duì)話框?qū)ο笪鰳?gòu)時(shí)就會(huì)調(diào)用我們自定義的析構(gòu)函數(shù)。在CcalculatorDlg.h文件中為CcalculatorDlg添加析構(gòu)函數(shù)聲明:CcalculatorDlg();然后在CcalculatorDlg.cpp文件中添加析構(gòu)函數(shù)的實(shí)現(xiàn)。例程5.屏幕全屏顯示/得到屏幕大小m_nMaxX = GetSystemMetrics(SM_CXSCREEN);m_nMaxY = GetSystemMetrics(SM_CYSCREEN);/全屏顯示CRect rcTemp; rcTemp.BottomRight() =CPoint(m_nMaxX, m_nMaxY);rcTemp.TopLeft() = CPoint(0, 0); MoveWindow(&rcTemp);例程6.WINCE添加菜單欄到對(duì)話框中在對(duì)話框初始化程序中加入以下變量,其中IDR_MENU為菜單欄的ID。/將菜單與界面關(guān)聯(lián)起來(lái)HINSTANCE hInst = AfxGetResourceHandle(); HWND hwndCB = CommandBar_Create(hInst,this-GetSafeHwnd(),1); if(hwndCB = NULL) TRACE0(Failed to create CommandBar/n); if(!CommandBar_InsertMenubar(hwndCB,hInst,IDR_MENU,3) ) TRACE0(Failed Insert Menu to CommandBar/n); 例程7.如何更改對(duì)話框的背景在對(duì)話框中添加全局變量m_brush,在構(gòu)造對(duì)話框函數(shù)中創(chuàng)建畫刷。在對(duì)話框中添加WM_CTRCOLOR事件。將函數(shù)的返回值該為m_brush即可。例程8.繪制坐標(biāo)軸以及網(wǎng)格void CnewtableDlg:tablebk()CPaintDC dc(this);INT i(0); INT iXStart(0), iYStart(0), iXEnd(0), iYEnd(0); INT iChartWidth(0), iChartHeight(0); CPen extPenGrid; CPen intPenGrid;/ CPen* pOldPen; CRect rcGrid;CRect rcClient(10,10,m_nMaxX-10,m_nMaxY/3*2);CPen solidpen(PS_SOLID,1,RGB(0,0,0); CPen* oldpen = dc.SelectObject(&solidpen);dc.MoveTo(rcClient.left,rcClient.top);dc.LineTo(rcClient.left,rcClient.bottom);/dc.LineTo(rcClient.left,rcClient.top);/dc.LineTo(rcClient.right-1,rcClient.top);/dc.LineTo(rcClient.right-1,rcClient.bottom-1);dc.LineTo(rcClient.right,rcClient.bottom-1);dc.SelectObject(oldpen); float m_fYFirstValue = 0.0f;float m_fYEndValue = 500.0f; intm_iXWord = 10;int m_iYWord = 5;CPen pen(PS_DOT,1,RGB(255,0,0);CPen pens(PS_SOLID,1,RGB(0,0,0);/ CPen* odpen = dc.SelectObject(&solidpen);/ dc.MoveTo(rcClient.left,rcClient.Height()/2);/ dc.LineTo(rcClient.right,rcClient.Height()/2);/CPen pens(PS_SOLID,1,RGB(0,0,0);/繪制網(wǎng)格for (int i=0;i0)oldpen = dc.SelectObject(&pen);dc.MoveTo(rcClient.left+5,rcClient.bottom-(i*rcClient.Height()/m_iYWord);dc.LineTo(rcClient.right,rcClient.bottom-(i*rcClient.Height()/m_iYWord);dc.SelectObject(oldpen);for (int j=0;j5;j+)oldpen = dc.SelectObject(&pens);dc.MoveTo(rcClient.left,rcClient.bottom-(i*rcClient.Height()/m_iYWord-(j*rcClient.Height()/(m_iYWord*5);dc.LineTo(rcClient.left+5,rcClient.bottom-(i*rcClient.Height()/m_iYWord-(j*rcClient.Height()/(m_iYWord*5);dc.SelectObject(oldpen);oldpen = dc.SelectObject(&pens);dc.MoveTo(rcClient.left,rcClient.bottom-(i*rcClient.Height()/m_iYWord);dc.LineTo(rcClient.left+10,rcClient.bottom-(i*rcClient.Height()/m_iYWord);dc.SelectObject(oldpen);for(int i=0;i0)oldpen = dc.SelectObject(&pen);dc.MoveTo(rcClient.left+i*rcClient.Width()/m_iXWord,rcClient.bottom);dc.LineTo(rcClient.left+i*rcClient.Width()/m_iXWord,rcClient.top);dc.SelectObject(oldpen);for(int j=0;jSelectObject(&font);pDC-SetTextColor(RGB(255,255,0);pDC-SetBkMode(TRANSPARENT);pDC-ExtTextOutW(rcClient.right-10,rcClient.bottom-20,ETO_CLIPPED,NULL,_T(時(shí)間),NULL);例程10 .避免閃爍的方法(OnEraseBkgnd)在圖形圖象處理編程過(guò)程中,雙緩沖是一種基本的技術(shù)。我們知道,如果窗體在響應(yīng)WM_PAINT消息的時(shí)候要進(jìn)行復(fù)雜的圖形處理,那么窗體在重繪時(shí)由于過(guò)頻的刷新而引起閃爍現(xiàn)象。解決這一問(wèn)題的有效方法就是雙緩沖技術(shù)。因?yàn)榇绑w在刷新時(shí),總要有一個(gè)擦除原來(lái)圖象的過(guò)程OnEraseBkgnd,它利用背景色填充窗體繪圖區(qū),然后在調(diào)用新的繪圖代碼進(jìn)行重繪,這樣一擦一寫造成了圖象顏色的反差。當(dāng)WM_PAINT的響應(yīng)很頻繁的時(shí)候,這種反差也就越發(fā)明顯。于是我們就看到了閃爍現(xiàn)象。我們會(huì)很自然的想到,避免背景色的填充是最直接的辦法。但是那樣的話,窗體上會(huì)變的一團(tuán)糟。因?yàn)槊看卫L制圖象的時(shí)候都沒有將原來(lái)的圖象清除,造 成了圖象的殘留,于是窗體重繪時(shí),畫面往往會(huì)變的亂七八糟。所以單純的禁止背景重繪是不夠的。我們還要進(jìn)行重新繪圖,但要求速度很快,于是我們想到了使用 BitBlt函數(shù)。它可以支持圖形塊的復(fù)制,速度很快。我們可以先在內(nèi)存中作圖,然后用此函數(shù)將做好的圖復(fù)制到前臺(tái),同時(shí)禁止背景刷新,這樣就消除了閃 爍。以上也就是雙緩沖繪圖的基本的思路。先按普通做圖的方法進(jìn)行編程。即在視類的OnDraw函數(shù)中添加繪圖代碼。在此我們繪制若干同心圓,代碼如下:CBCDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CPoint ptCenter;CRect rect,ellipseRect;GetClientRect(&rect);ptCenter = rect.CenterPoint();for(int i=20;i0;i-) ellipseRect.SetRect(ptCenter,ptCenter); ellipseRect.InflateRect(i*10,i*10); pDC-Ellipse(ellipseRect);編譯運(yùn)行程序,嘗試改變窗口大小,可以發(fā)現(xiàn)閃爍現(xiàn)象。在雙緩沖方法中,首先要做的是屏蔽背景刷新。背景刷新其實(shí)是在響應(yīng)WM_ERASEBKGND消息。我們?cè)谝曨愔刑砑訉?duì)這個(gè)消息的響應(yīng),可以看到缺省的代碼如下:BOOL CMYView:OnEraseBkgnd(CDC* pDC) return CView:OnEraseBkgnd(pDC);是調(diào)用父類的OnEraseBkgnd函數(shù),我們屏蔽此調(diào)用,只須直接return TRUE;即可。下面是內(nèi)存緩沖作圖的步驟.CBitmap bit;bit.LoadBitmapA(IDB_BITMAP1);BITMAP bm;bit.GetBitmap(&bm);CDC memDc;memDc.CreateCompatibleDC(pDC);CBitmap* pOldBitmap = memDc.SelectObject(&bit);CRect rect;GetClientRect(&rect);pDC-SetStretchBltMode(COLORONCOLOR);/這個(gè)模式不設(shè)置的話會(huì)導(dǎo)致圖片嚴(yán)重失真pDC-StretchBlt(0,0,rect.Width() ,rect.Height(),&memDc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);memDc.SelectObject(pOldBitmap);memDc.DeleteDC(); /刪除DCbm.DeleteObject(); /刪除位圖由于復(fù)雜的畫圖操作轉(zhuǎn)入后臺(tái),我們看到的是速度很快的復(fù)制操作,自然也就消除了閃爍現(xiàn)象。Q: OnEraseBkgnd函數(shù)中返回TRUE或FALSE有什么區(qū)別?A:WM_ERASEBKGNDReturn ValuesAn application should return nonzero if it erases the background; otherwise, it should return zero.A:true表示已處理背景刷新,false表示需要在OnPaint里處理Q:在OnEraseBkgnd中繪制對(duì)話框的背景圖片和在OnPaint中繪制對(duì)話框的背景圖片由什么區(qū)別,另外OnEraseBkgnd和CtlColor有什么區(qū)別?A:OnEraseBkgnd是在窗口大小發(fā)生改變等情況下發(fā)生的,它將繪制窗口背景;而OnCtlColor是當(dāng)窗口的控件需要繪制時(shí)發(fā)生的,它將繪制窗口的控件。A:OnEraseBkgnd :在窗口背景需要重繪時(shí)調(diào)用.OnPaint : 此時(shí)OnEraseBkgnd已經(jīng)調(diào)用過(guò)了,所以在此響應(yīng)函數(shù)體內(nèi)對(duì)背景進(jìn)行的操作將覆蓋OnEraseBkgnd中所做的操作.OnCtlColor : 有于在窗口將要被(第一次)繪制時(shí)響應(yīng),子窗口可以通過(guò)發(fā)關(guān)WM_CTLCOLOR請(qǐng)求父窗口傳來(lái)一個(gè)HBRUSH.例程11 . MFC如何高效地繪圖 顯示圖形如何避免閃爍,如何提高顯示效率是問(wèn)得比較多的問(wèn)題。而且多數(shù)人認(rèn)為MFC的繪圖函數(shù)效率很低,總是想尋求其它的解決方案。MFC的繪圖效率的確不高但也不差,而且它的繪圖函數(shù)使用非常簡(jiǎn)單,只要使用方法得當(dāng),再加上一些技巧,用MFC可以得到效率很高的繪圖程序。 我想就我長(zhǎng)期(呵呵當(dāng)然也只有2年多)使用MFC繪圖的經(jīng)驗(yàn)談?wù)?我的一些觀點(diǎn)。 1、顯示的圖形為什么會(huì)閃爍? 我們的繪圖過(guò)程大多放在OnDraw或者OnPaint函數(shù)中,OnDraw在進(jìn)行屏 幕顯示時(shí)是由OnPaint進(jìn)行調(diào)用的。當(dāng)窗口由于任何原因需要重繪時(shí),總是先用背景色將顯示區(qū)清除,然后才調(diào)用OnPaint,而背景色往往與繪圖內(nèi)容反差很大,這樣在短時(shí)間內(nèi)背景色與顯示圖形的交替出現(xiàn),使得顯示窗口看起來(lái)在閃。如果將背景刷設(shè)置成NULL,這樣無(wú)論怎樣重繪圖形都不會(huì)閃了。當(dāng)然,這樣做會(huì)使得窗口的顯示亂成一團(tuán),因?yàn)橹乩L時(shí)沒有背景色對(duì)原來(lái) 繪制的圖形進(jìn)行清除,而又疊加上了新的圖形。 有的人會(huì)說(shuō),閃爍是因?yàn)槔L圖的速度太慢或者顯示的圖形太復(fù)雜造成的, 其實(shí)這樣說(shuō)并不對(duì),繪圖的顯示速度對(duì)閃爍的影響不是根本性的。 例如在OnDraw(CDC *pDC)中這樣寫: pDC- MoveTo(0,0); pDC- LineTo(100,100); 這個(gè)繪圖過(guò)程應(yīng)該是非常簡(jiǎn)單、非??炝税?,但是拉動(dòng)窗口變化時(shí)還是會(huì)看見 閃爍。其實(shí)從道理上講,畫圖的過(guò)程越復(fù)雜越慢閃爍應(yīng)該越少,因?yàn)槔L圖用的 時(shí)間與用背景清除屏幕所花的時(shí)間的比例越大人對(duì)閃爍的感覺會(huì)越不明顯。 比如:清楚屏幕時(shí)間為1s繪圖時(shí)間也是為1s,這樣在10s內(nèi)的連續(xù)重畫中就要閃 爍5次;如果清楚屏幕時(shí)間為1s不變,而繪圖時(shí)間為9s,這樣10s內(nèi)的連續(xù)重畫 只會(huì)閃爍一次。這個(gè)也可以試驗(yàn),在OnDraw(CDC *pDC)中這樣寫: for(int i=0;i MoveTo(0,i); pDC- LineTo(1000,i); 呵呵,程序有點(diǎn)變態(tài),但是能說(shuō)明問(wèn)題。 說(shuō)到這里可能又有人要說(shuō)了,為什么一個(gè)簡(jiǎn)單圖形看起來(lái)沒有復(fù)雜圖形那么 閃呢?這是因?yàn)閺?fù)雜圖形占的面積大,重畫時(shí)造成的反差比較大,所以感覺上要 閃得厲害一些,但是閃爍頻率要低。 那為什么動(dòng)畫的重畫頻率高,而看起來(lái)卻不閃?這里,我就要再次強(qiáng)調(diào)了, 閃爍是什么?閃爍就是反差,反差越大,閃爍越厲害。因?yàn)閯?dòng)畫的連續(xù)兩個(gè)幀之間 的差異很小所以看起來(lái)不閃。如果不信,可以在動(dòng)畫的每一幀中間加一張純白的幀, 不閃才怪呢。 2、如何避免閃爍 在知道圖形顯示閃爍的原因之后,對(duì)癥下藥就好辦了。首先當(dāng)然是去掉MFC 提供的背景繪制過(guò)程了。實(shí)現(xiàn)的方法很多, * 可以在窗口形成時(shí)給窗口的注冊(cè)類的背景刷付NULL * 也可以在形成以后修改背景 static CBrush brush(RGB(255,0,0); SetClassLong(this- m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush); * 要簡(jiǎn)單也可以重載OnEraseBkgnd(CDC* pDC)直接返回TRUE 這樣背景沒有了,結(jié)果圖形顯示的確不閃了,但是顯示也象前面所說(shuō)的一樣, 變得一團(tuán)亂。怎么辦?這就要用到雙緩存的方法了。雙緩沖就是除了在屏幕上有 圖形進(jìn)行顯示以外,在內(nèi)存中也有圖形在繪制。我們可以把要顯示的圖形先在內(nèi)存中 繪制好,然后再一次性的將內(nèi)存中的圖形按照一個(gè)點(diǎn)一個(gè)點(diǎn)地覆蓋到屏幕上去(這個(gè) 過(guò)程非???,因?yàn)槭欠浅R?guī)整的內(nèi)存拷貝)。這樣在內(nèi)存中繪圖時(shí),隨便用什么反差 大的背景色進(jìn)行清除都不會(huì)閃,因?yàn)榭床灰?。?dāng)貼到屏幕上時(shí),因?yàn)閮?nèi)存中最終的圖形 與屏幕顯示圖形差別很?。ㄈ绻麤]有運(yùn)動(dòng),當(dāng)然就沒有差別),這樣看起來(lái)就不會(huì)閃。 3、如何實(shí)現(xiàn)雙緩沖 首先給出實(shí)現(xiàn)的程序,然后再解釋,同樣是在OnDraw(CDC *pDC)中: CDC MemDC; /首先定義一個(gè)顯示設(shè)備對(duì)象 CBitmap MemBitmap;/定義一個(gè)位圖對(duì)象 /隨后建立與屏幕顯示兼容的內(nèi)存顯示設(shè)備 MemDC.CreateCompatibleDC(NULL); /這時(shí)還不能繪圖,因?yàn)闆]有地方畫 _ /下面建立一個(gè)與屏幕顯示兼容的位圖,至于位圖的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /將位圖選入到內(nèi)存顯示設(shè)備中 /只有選入了位圖的內(nèi)存顯示設(shè)備才有地方繪圖,畫到指定的位圖上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); /先用背景色將位圖清除干凈,這里我用的是白色作為背景 /你也可以用自己應(yīng)該用的顏色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255); /繪圖 MemDC.MoveTo(); MemDC.LineTo(); /將內(nèi)存中的圖拷貝到屏幕上進(jìn)行顯示 pDC- BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); /繪圖完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); 上面的注釋應(yīng)該很詳盡了,廢話就不多說(shuō)了。 4、如何提高繪圖的效率 我主要做的是電力系統(tǒng)的網(wǎng)絡(luò)圖形的CAD軟件,在一個(gè)窗口中往往要顯示成千上萬(wàn)個(gè)電力元件,而每個(gè)元件又是由點(diǎn)、線、圓等基本圖形構(gòu)成。如果真要在一次重繪過(guò)程重畫這么多元件,可想而知這個(gè)過(guò)程是非常漫長(zhǎng)的。如果加上了圖形的瀏覽功能,鼠標(biāo)拖動(dòng)圖形滾動(dòng)時(shí)需要進(jìn)行大量的重繪,速度會(huì)慢得讓用戶將無(wú)法忍受。怎么辦?只有再研究研究MFC的繪圖過(guò)程了。 實(shí)際上,在OnDraw(CDC *pDC)中繪制的圖并不是所有都顯示了的,例如:你 在OnDraw中畫了兩個(gè)矩形,在一次重繪中雖然兩個(gè)矩形的繪制函數(shù)都有執(zhí)行,但是很有可能只有一個(gè)顯示了,這是因?yàn)镸FC本身為了提高重繪的效率設(shè)置了裁剪區(qū)。裁剪區(qū)的作用就是:只有在這個(gè)區(qū)內(nèi)的繪圖過(guò)程才會(huì)真正有效,在區(qū)外的是無(wú)效的,即使在區(qū)外執(zhí)行了繪圖函數(shù)也是不會(huì)顯示的。因?yàn)槎鄶?shù)情況下窗口重繪的產(chǎn)生大多是因?yàn)榇翱诓糠直徽趽趸蛘叽翱谟袧L動(dòng)發(fā)生,改變的區(qū)域并不是整個(gè)圖形而只有一小部分,這一部分需要改變的就是pDC中的裁剪區(qū)了。因?yàn)轱@示(往內(nèi)存或者顯存都叫顯示)比繪圖過(guò)程的計(jì)算要費(fèi)時(shí)得多,有了裁剪區(qū)后顯示的就只是應(yīng)該顯示的部分,大大提高了顯示效率。但是這個(gè)裁剪區(qū)是MFC設(shè)置的,它已經(jīng)為我們提高了顯示效率,在進(jìn)行復(fù)雜圖形的繪制時(shí)如何進(jìn)一步提高效率呢?那就只有去掉在裁剪區(qū)外的繪圖過(guò)程了??梢韵扔胮DC- GetClipBox()得到裁剪區(qū),然后在繪圖時(shí)判斷你的圖形是否在這個(gè)區(qū)內(nèi),如果在就畫,不在就不畫。 如果你的繪圖過(guò)程不復(fù)雜,這樣做可能對(duì)你的繪圖效率不會(huì)有提高。例程12.如何一直點(diǎn)擊按鈕觸發(fā)一個(gè)事件BOOL CalldownDlg:PreTranslateMessage(MSG* pMsg)/ TODO: 在此添加專用代碼和/或調(diào)用基類if(pMsg-message = WM_LBUTTONDOWN|pMsg-message = WM_LBUTTONUP)CPoint pnt;GetCursorPo
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)分包班組管理制度
- 宿舍電表安裝方案(3篇)
- 農(nóng)業(yè)園區(qū)財(cái)物管理制度
- 超市到期退場(chǎng)方案(3篇)
- 醫(yī)院安保規(guī)章管理制度
- 商砼公司人事管理制度
- 品牌創(chuàng)建培育方案(3篇)
- 衛(wèi)生應(yīng)急工作管理制度
- 裝修工程賠補(bǔ)方案(3篇)
- 廚房蔬菜進(jìn)貨管理制度
- 財(cái)務(wù)培訓(xùn):AI與財(cái)稅合規(guī)的未來(lái)
- 全國(guó)農(nóng)業(yè)行業(yè)職業(yè)技能大賽(農(nóng)業(yè)技術(shù)員)理論考試題(附答案)
- 直招軍官面試題庫(kù)及答案
- 2025至2030中國(guó)磷石膏市場(chǎng)行情走勢(shì)監(jiān)測(cè)及未來(lái)發(fā)展展望報(bào)告
- 青少年足球訓(xùn)練營(yíng)未來(lái)三年計(jì)劃
- 2025建設(shè)工程施工專業(yè)分包合同(示范文本)-建設(shè)工程專業(yè)分包合同(示范文本)
- 2024年系統(tǒng)分析師考試的重要趨勢(shì)發(fā)現(xiàn):試題及答案
- 成人禮活動(dòng)流程
- 測(cè)繪管理考試試題及答案
- 青馬班面試試題及答案
- 2025年廣東物理中考二輪專題復(fù)習(xí)之質(zhì)量與密度(含答案)
評(píng)論
0/150
提交評(píng)論