




已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
例程1. MFChello步驟1.選擇新建-項目,打開后出現(xiàn)如果1所示對話框。選擇VC+中的智能設備,在右邊選擇MFC智能設備應用程序。在下方的名稱中輸入MFChello,點擊確定。步驟2.點擊下一步步驟3.將Mini2440-CE6-SDK移到右邊,點擊下一步。步驟4.在應用程序類型選擇基于對話框,直接點擊完成。步驟5.選擇類視圖,點擊CMFChelloApp,在下方可以看到InitInstance(void)函數(shù),雙擊該函數(shù)。步驟6在BOOL CMFChelloApp:InitInstance()添加如下代碼AfxEnableControlContainer(); /調(diào)用此函數(shù)的目的是為了使程序支持包含OLE控件MessageBox(NULL,_T(一個簡單的MFC程序),_T(你好),MB_OK); /談出對話框例程2.鼠標測試程序同例程1一樣,建立一個基于對話框的MouseTest程序。在右邊的對話框編輯器中選擇Static Text,添加到對話框中一個靜態(tài)文本,然后更改右下角的靜態(tài)文本的屬性,Caption改為提示:點一下鼠標右鍵或左鍵,ID改為IDC_STATIC點擊對話框,在右下角點擊消息按鈕,出現(xiàn)下圖。找到WM_LBUTTONDOWN消息,添加OnLButtonDown函數(shù)。在函數(shù)中添加代碼如下MessageBox(NULL,_T(你點的是左鍵),_T(The first Dialog),MB_OK);同樣操作在WM_RBUTTONDOWN消息,添加OnRButtonDown函數(shù)。在函數(shù)中添加代碼如下MessageBox(NULL,_T(你點的是右鍵),_T(The first Dialog),MB_OK);進行仿真即可。例程3.添加圖標創(chuàng)建一個基于對話框的IconTest程序。切換到資源視圖。右鍵點擊Icon,選擇添加資源,彈出下圖。選擇導入,導入一個圖標文件(.ico)文件,如下圖。點擊CIconTestDlg類,找到CIconTestDlg函數(shù)。找到下面的語句:m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);改為下面的語句:m_hIcon = AfxGetApp()-LoadIcon(IDI_ICON1);點擊仿真可看到對話框左上角的圖標已經(jīng)改變。例程4.簡單計算機1.0創(chuàng)建基于對話框的calculator項目。點擊Dialog,添加如下控件。在加數(shù)編輯框右擊添加變量。變量名稱是m_editSummand,變量類型是double,類別為value。同樣操作添加被加數(shù)編輯框變量。變量名稱是m_editAddend,變量類型是double,類別為value。和編輯框變量。變量名稱是m_editSum,變量類型是double,類別為value。將計算按鈕的ID設為IDC_ADDBUTTON。雙擊該按鈕,進入void CcalculatorDlg:OnBnClickedAddbutton()函數(shù)。添加如下代碼:UpdateData(TRUE);m_editSum = m_editSummand + m_editAddend;UpdateData(FALSE);將退出按鈕的ID設為IDC_QUT。雙擊該按鈕,進入void CcalculatorDlg:OnBnClickedQut()函數(shù)。添加如下代碼:ShowWindow(SW_HIDE);/將非模態(tài)對話框隱藏仿真即可。在這個程序中對話框基本是由MFC自己創(chuàng)立的,下面說一下它是在哪里彈出的。打開calculator.cpp文件,可以看到有個InitInstance()函數(shù)。對話框就是在這里產(chǎn)生的。下面是這段代碼的注釋程序。BOOL CcalculatorApp:InitInstance()/ 標準初始化/ 如果未使用這些功能并希望減小/ 最終可執(zhí)行文件的大小,則應移除下列/ 不需要的特定初始化例程/ 更改用于存儲設置的注冊表項/ TODO: 應適當修改該字符串,/ 例如修改為公司或組織名SetRegistryKey(_T(應用程序向?qū)傻谋镜貞贸绦?;CcalculatorDlg dlg; /定義對話框類CcalculatorDlg的對象m_pMainWnd = &dlg; /將dlg設為主窗口INT_PTR nResponse = dlg.DoModal(); /彈出對話dlg,并將DoModal函數(shù)的返回值(退出時點擊/按鈕的ID)賦值給nResponseif (nResponse = IDOK) /判斷返回值是否為OK按鈕/ TODO: 在此處放置處理何時用“確定”來關閉/ 對話框的代碼 Else if(nResponse = IDCANCEL) /判斷返回值是否為Cancel按鈕 / 由于對話框已關閉,所以將返回FALSE 以便退出應用程序,/ 而不是啟動應用程序的消息泵。return FALSE;彈出對話框比較關鍵的一個函數(shù),就是對話框類的DoModal()函數(shù)。CDialog:DoModal()函數(shù)的原型為: Virtual INT_PTR DoModal(); 返回值:整數(shù)值,指定了傳遞給CDialog:EndDialog(該函數(shù)用于關閉對話框)的nResult函數(shù)值。如果函數(shù)不能創(chuàng)建對話框,則返回-1;如果出現(xiàn)其他錯誤,則返回IDABORT。調(diào)用了它對話框就會彈出,返回值是退出對話框時所點的按鈕的ID,比如,我們點了“退出”按鈕,那么DoModal返回值為IDCANCEL。添加一個新的對話框并彈出它切換到資源視圖,右擊Dialog,選擇插入Dialog,將新插入的Dialog的ID改為IDD_TIP_DIALOG,添加一個靜態(tài)文本。如下圖右擊該對話框,選擇添加類,類的名字為CTipDlg,點OK。在calculator.cpp中添加頭文件:#include “TipDlg.h”.修改void CcalculatorDlg:OnBnClickedAddbutton(),代碼如下INT_PTR nRes; /用于保存DoModal函數(shù)的返回值CTipDlg tipDlg; /構(gòu)造對話框類CTipDlg的實例nRes = tipDlg.DoModal(); /彈出對話框if(IDCANCEL = nRes) /判斷對話框退出后返回值是否為IDCANCEL,如果是則return,否則繼續(xù)return;仿真即可。創(chuàng)建及顯示非模態(tài)對話框的步驟1.在calculatorDlg.h中包含CTipDlg類型的指針成員變量。詳細操作方法是,在calculatorDlg.cpp中刪除之前添加的#include”TipDlg.h”,而在calculatorDlg.h中添加#include” TipDlg.h”,這是因為我們需要在calculatorDlg.h中定義CTipDlg類型的指針變量,所以要先包含它的頭文件,然后再calculatorDlg.h中為CcalculatorDlg類添加private成員變量CTipDlg *m_pTipDlg.2.在CcalculatorDlg類的構(gòu)造函數(shù)中初始化成員變量m_pTipDlg。如果cpp文件中函數(shù)太多,我們可以在Class View上半個視圖中找到CcalculatorDlg類,再在下半個視圖中找到其構(gòu)造函數(shù)雙擊,中間客戶區(qū)域即可馬上切換到構(gòu)造函數(shù)的實現(xiàn)處。在構(gòu)造函數(shù)中添加m_pTipDlg=NULL;。在任何指針變量使用前都初始化,可以避免因誤訪問重要內(nèi)存地址而破壞此地址的數(shù)據(jù)。3.將上面添加模態(tài)對話框顯示代碼注釋掉。修改CcalculatorDlg:OnBnClickedAddbutton()函數(shù)。void CcalculatorDlg:OnBnClickedAddbutton()/ TODO: 在此添加控件通知處理程序代碼/*INT_PTR nRes; /用于保存DoModal函數(shù)的返回值CTipDlg tipDlg; /構(gòu)造對話框類CTipDlg的實例nRes = tipDlg.DoModal(); /彈出對話框if(IDCANCEL = nRes) /判斷對話框退出后返回值是否為IDCANCEL,如果是則return,否則繼續(xù)return;*/if(NULL=m_pTipDlg)/創(chuàng)建非模態(tài)對話框?qū)嵗齧_pTipDlg = new CTipDlg();m_pTipDlg-Create(IDD_TIP_DIALOG,this);/顯示非模態(tài)對話框m_pTipDlg-ShowWindow(SW_SHOW);/將各控件中的數(shù)據(jù)保存到相應的變量UpdateData(TRUE);m_editSum = m_editSummand + m_editAddend;UpdateData(FALSE);4.因為此非模態(tài)對話框?qū)嵗莿討B(tài)創(chuàng)建的,所以需要手動刪除此動態(tài)對象來銷毀對話框。我們在CcalculatorDlg類的析構(gòu)函數(shù)中添加刪除代碼,但是MFC并沒有自動給出析構(gòu)函數(shù),這時需要手動添加,在對話框?qū)ο笪鰳?gòu)時就會調(diào)用我們自定義的析構(gòu)函數(shù)。在CcalculatorDlg.h文件中為CcalculatorDlg添加析構(gòu)函數(shù)聲明:CcalculatorDlg();然后在CcalculatorDlg.cpp文件中添加析構(gòu)函數(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添加菜單欄到對話框中在對話框初始化程序中加入以下變量,其中IDR_MENU為菜單欄的ID。/將菜單與界面關聯(lián)起來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.如何更改對話框的背景在對話框中添加全局變量m_brush,在構(gòu)造對話框函數(shù)中創(chuàng)建畫刷。在對話框中添加WM_CTRCOLOR事件。將函數(shù)的返回值該為m_brush即可。例程8.繪制坐標軸以及網(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(時間),NULL);例程10 .避免閃爍的方法(OnEraseBkgnd)在圖形圖象處理編程過程中,雙緩沖是一種基本的技術(shù)。我們知道,如果窗體在響應WM_PAINT消息的時候要進行復雜的圖形處理,那么窗體在重繪時由于過頻的刷新而引起閃爍現(xiàn)象。解決這一問題的有效方法就是雙緩沖技術(shù)。因為窗體在刷新時,總要有一個擦除原來圖象的過程OnEraseBkgnd,它利用背景色填充窗體繪圖區(qū),然后在調(diào)用新的繪圖代碼進行重繪,這樣一擦一寫造成了圖象顏色的反差。當WM_PAINT的響應很頻繁的時候,這種反差也就越發(fā)明顯。于是我們就看到了閃爍現(xiàn)象。我們會很自然的想到,避免背景色的填充是最直接的辦法。但是那樣的話,窗體上會變的一團糟。因為每次繪制圖象的時候都沒有將原來的圖象清除,造 成了圖象的殘留,于是窗體重繪時,畫面往往會變的亂七八糟。所以單純的禁止背景重繪是不夠的。我們還要進行重新繪圖,但要求速度很快,于是我們想到了使用 BitBlt函數(shù)。它可以支持圖形塊的復制,速度很快。我們可以先在內(nèi)存中作圖,然后用此函數(shù)將做好的圖復制到前臺,同時禁止背景刷新,這樣就消除了閃 爍。以上也就是雙緩沖繪圖的基本的思路。先按普通做圖的方法進行編程。即在視類的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);編譯運行程序,嘗試改變窗口大小,可以發(fā)現(xiàn)閃爍現(xiàn)象。在雙緩沖方法中,首先要做的是屏蔽背景刷新。背景刷新其實是在響應WM_ERASEBKGND消息。我們在視類中添加對這個消息的響應,可以看到缺省的代碼如下: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);/這個模式不設置的話會導致圖片嚴重失真pDC-StretchBlt(0,0,rect.Width() ,rect.Height(),&memDc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);memDc.SelectObject(pOldBitmap);memDc.DeleteDC(); /刪除DCbm.DeleteObject(); /刪除位圖由于復雜的畫圖操作轉(zhuǎn)入后臺,我們看到的是速度很快的復制操作,自然也就消除了閃爍現(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中繪制對話框的背景圖片和在OnPaint中繪制對話框的背景圖片由什么區(qū)別,另外OnEraseBkgnd和CtlColor有什么區(qū)別?A:OnEraseBkgnd是在窗口大小發(fā)生改變等情況下發(fā)生的,它將繪制窗口背景;而OnCtlColor是當窗口的控件需要繪制時發(fā)生的,它將繪制窗口的控件。A:OnEraseBkgnd :在窗口背景需要重繪時調(diào)用.OnPaint : 此時OnEraseBkgnd已經(jīng)調(diào)用過了,所以在此響應函數(shù)體內(nèi)對背景進行的操作將覆蓋OnEraseBkgnd中所做的操作.OnCtlColor : 有于在窗口將要被(第一次)繪制時響應,子窗口可以通過發(fā)關WM_CTLCOLOR請求父窗口傳來一個HBRUSH.例程11 . MFC如何高效地繪圖 顯示圖形如何避免閃爍,如何提高顯示效率是問得比較多的問題。而且多數(shù)人認為MFC的繪圖函數(shù)效率很低,總是想尋求其它的解決方案。MFC的繪圖效率的確不高但也不差,而且它的繪圖函數(shù)使用非常簡單,只要使用方法得當,再加上一些技巧,用MFC可以得到效率很高的繪圖程序。 我想就我長期(呵呵當然也只有2年多)使用MFC繪圖的經(jīng)驗談談 我的一些觀點。 1、顯示的圖形為什么會閃爍? 我們的繪圖過程大多放在OnDraw或者OnPaint函數(shù)中,OnDraw在進行屏 幕顯示時是由OnPaint進行調(diào)用的。當窗口由于任何原因需要重繪時,總是先用背景色將顯示區(qū)清除,然后才調(diào)用OnPaint,而背景色往往與繪圖內(nèi)容反差很大,這樣在短時間內(nèi)背景色與顯示圖形的交替出現(xiàn),使得顯示窗口看起來在閃。如果將背景刷設置成NULL,這樣無論怎樣重繪圖形都不會閃了。當然,這樣做會使得窗口的顯示亂成一團,因為重繪時沒有背景色對原來 繪制的圖形進行清除,而又疊加上了新的圖形。 有的人會說,閃爍是因為繪圖的速度太慢或者顯示的圖形太復雜造成的, 其實這樣說并不對,繪圖的顯示速度對閃爍的影響不是根本性的。 例如在OnDraw(CDC *pDC)中這樣寫: pDC- MoveTo(0,0); pDC- LineTo(100,100); 這個繪圖過程應該是非常簡單、非??炝税桑抢瓌哟翱谧兓瘯r還是會看見 閃爍。其實從道理上講,畫圖的過程越復雜越慢閃爍應該越少,因為繪圖用的 時間與用背景清除屏幕所花的時間的比例越大人對閃爍的感覺會越不明顯。 比如:清楚屏幕時間為1s繪圖時間也是為1s,這樣在10s內(nèi)的連續(xù)重畫中就要閃 爍5次;如果清楚屏幕時間為1s不變,而繪圖時間為9s,這樣10s內(nèi)的連續(xù)重畫 只會閃爍一次。這個也可以試驗,在OnDraw(CDC *pDC)中這樣寫: for(int i=0;i MoveTo(0,i); pDC- LineTo(1000,i); 呵呵,程序有點變態(tài),但是能說明問題。 說到這里可能又有人要說了,為什么一個簡單圖形看起來沒有復雜圖形那么 閃呢?這是因為復雜圖形占的面積大,重畫時造成的反差比較大,所以感覺上要 閃得厲害一些,但是閃爍頻率要低。 那為什么動畫的重畫頻率高,而看起來卻不閃?這里,我就要再次強調(diào)了, 閃爍是什么?閃爍就是反差,反差越大,閃爍越厲害。因為動畫的連續(xù)兩個幀之間 的差異很小所以看起來不閃。如果不信,可以在動畫的每一幀中間加一張純白的幀, 不閃才怪呢。 2、如何避免閃爍 在知道圖形顯示閃爍的原因之后,對癥下藥就好辦了。首先當然是去掉MFC 提供的背景繪制過程了。實現(xiàn)的方法很多, * 可以在窗口形成時給窗口的注冊類的背景刷付NULL * 也可以在形成以后修改背景 static CBrush brush(RGB(255,0,0); SetClassLong(this- m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush); * 要簡單也可以重載OnEraseBkgnd(CDC* pDC)直接返回TRUE 這樣背景沒有了,結(jié)果圖形顯示的確不閃了,但是顯示也象前面所說的一樣, 變得一團亂。怎么辦?這就要用到雙緩存的方法了。雙緩沖就是除了在屏幕上有 圖形進行顯示以外,在內(nèi)存中也有圖形在繪制。我們可以把要顯示的圖形先在內(nèi)存中 繪制好,然后再一次性的將內(nèi)存中的圖形按照一個點一個點地覆蓋到屏幕上去(這個 過程非???,因為是非常規(guī)整的內(nèi)存拷貝)。這樣在內(nèi)存中繪圖時,隨便用什么反差 大的背景色進行清除都不會閃,因為看不見。當貼到屏幕上時,因為內(nèi)存中最終的圖形 與屏幕顯示圖形差別很?。ㄈ绻麤]有運動,當然就沒有差別),這樣看起來就不會閃。 3、如何實現(xiàn)雙緩沖 首先給出實現(xiàn)的程序,然后再解釋,同樣是在OnDraw(CDC *pDC)中: CDC MemDC; /首先定義一個顯示設備對象 CBitmap MemBitmap;/定義一個位圖對象 /隨后建立與屏幕顯示兼容的內(nèi)存顯示設備 MemDC.CreateCompatibleDC(NULL); /這時還不能繪圖,因為沒有地方畫 _ /下面建立一個與屏幕顯示兼容的位圖,至于位圖的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /將位圖選入到內(nèi)存顯示設備中 /只有選入了位圖的內(nèi)存顯示設備才有地方繪圖,畫到指定的位圖上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); /先用背景色將位圖清除干凈,這里我用的是白色作為背景 /你也可以用自己應該用的顏色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255); /繪圖 MemDC.MoveTo(); MemDC.LineTo(); /將內(nèi)存中的圖拷貝到屏幕上進行顯示 pDC- BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); /繪圖完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); 上面的注釋應該很詳盡了,廢話就不多說了。 4、如何提高繪圖的效率 我主要做的是電力系統(tǒng)的網(wǎng)絡圖形的CAD軟件,在一個窗口中往往要顯示成千上萬個電力元件,而每個元件又是由點、線、圓等基本圖形構(gòu)成。如果真要在一次重繪過程重畫這么多元件,可想而知這個過程是非常漫長的。如果加上了圖形的瀏覽功能,鼠標拖動圖形滾動時需要進行大量的重繪,速度會慢得讓用戶將無法忍受。怎么辦?只有再研究研究MFC的繪圖過程了。 實際上,在OnDraw(CDC *pDC)中繪制的圖并不是所有都顯示了的,例如:你 在OnDraw中畫了兩個矩形,在一次重繪中雖然兩個矩形的繪制函數(shù)都有執(zhí)行,但是很有可能只有一個顯示了,這是因為MFC本身為了提高重繪的效率設置了裁剪區(qū)。裁剪區(qū)的作用就是:只有在這個區(qū)內(nèi)的繪圖過程才會真正有效,在區(qū)外的是無效的,即使在區(qū)外執(zhí)行了繪圖函數(shù)也是不會顯示的。因為多數(shù)情況下窗口重繪的產(chǎn)生大多是因為窗口部分被遮擋或者窗口有滾動發(fā)生,改變的區(qū)域并不是整個圖形而只有一小部分,這一部分需要改變的就是pDC中的裁剪區(qū)了。因為顯示(往內(nèi)存或者顯存都叫顯示)比繪圖過程的計算要費時得多,有了裁剪區(qū)后顯示的就只是應該顯示的部分,大大提高了顯示效率。但是這個裁剪區(qū)是MFC設置的,它已經(jīng)為我們提高了顯示效率,在進行復雜圖形的繪制時如何進一步提高效率呢?那就只有去掉在裁剪區(qū)外的繪圖過程了??梢韵扔胮DC- GetClipBox()得到裁剪區(qū),然后在繪圖時判斷你的圖形是否在這個區(qū)內(nèi),如果在就畫,不在就不畫。 如果你的繪圖過程不復雜,這樣做可能對你的繪圖效率不會有提高。例程12.如何一直點擊按鈕觸發(fā)一個事件BOOL CalldownDlg:PreTranslateMessage(MSG* pMsg)/ TODO: 在此添加專用代碼和/或調(diào)用基類if(pMsg-message = WM_LBUTTONDOWN|pMsg-message = WM_LBUTTONUP)CPoint pnt;GetCursorPo
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江汽車職業(yè)技術(shù)學院《深度報道研究》2023-2024學年第二學期期末試卷
- 黑龍江林業(yè)職業(yè)技術(shù)學院《信息系統(tǒng)開發(fā)與應用綜合專題》2023-2024學年第二學期期末試卷
- 河北醫(yī)科大學臨床學院《土地規(guī)劃設計》2023-2024學年第二學期期末試卷
- 重慶信息技術(shù)職業(yè)學院《環(huán)境與健康》2023-2024學年第二學期期末試卷
- 新疆維吾爾醫(yī)學??茖W?!缎l(wèi)生監(jiān)督學A》2023-2024學年第二學期期末試卷
- 晉中師范高等??茖W?!稒C械基礎與液壓傳動》2023-2024學年第二學期期末試卷
- 上海中僑職業(yè)技術(shù)大學《中醫(yī)診斷學實驗》2023-2024學年第二學期期末試卷
- 湖南司法警官職業(yè)學院《機器視覺系統(tǒng)設計與應用》2023-2024學年第二學期期末試卷
- 2024年醫(yī)學研究與試驗發(fā)展服務項目資金申請報告代可行性研究報告
- 連續(xù)剛構(gòu)橋畢業(yè)設計答辯
- 2025年北京保安證考試試題及答案
- 2024年第二次廣東省普通高中化學學業(yè)水平合格性考試真題卷含答案
- 2025年醫(yī)保知識考試題庫:醫(yī)保基金監(jiān)管案例及答案解析試卷
- 2024年湖南省普通高中學業(yè)水平合格性考試歷史試題(原卷版+解析版)
- 新版人教版七年級下冊地理課件 第九章 東半球其他的地區(qū)和國家 第四節(jié) 澳大利亞
- 《信息技術(shù)》課件-模塊二 信息檢索技術(shù)
- 《康復評定技術(shù)》課件-第五章 運動控制
- 《水門事件簡介》課件
- 第十章《浮力》達標測試卷(含答案)2024-2025學年度人教版物理八年級下冊
- 《建筑CAD 》課程標準
- 《抖音競品分析》課件
評論
0/150
提交評論