久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MFC中OnDraw與OnPaint的區(qū)別

 賢人好客 2010-12-25

學(xué)習(xí)中遇到一個(gè)問(wèn)題,,OnDraw與OnPaint有什么區(qū)別?上網(wǎng)搜索了一下,,又查了一下MSDN和MFC的一些源文件,,現(xiàn)整理如下。

OnPaint是WM_PAINT消息的消息處理函數(shù),,在OnPaint中調(diào)用OnDraw,,一般來(lái)說(shuō),用戶(hù)自己的繪圖代碼應(yīng)放在OnDraw中,。

OnPaint()是CWnd的類(lèi)成員,,負(fù)責(zé)響應(yīng)WM_PAINT消息。OnDraw()是CVIEW的成員函數(shù),,沒(méi)有響應(yīng)消息的功能.當(dāng)視圖變得無(wú)效時(shí)(包括大小的改變,,移動(dòng),被遮蓋等等),,Windows發(fā)送WM_PAINT消息,。該視圖的OnPaint 處理函數(shù)通過(guò)創(chuàng)建CPaintDC類(lèi)的DC對(duì)象來(lái)響應(yīng)該消息并調(diào)用視圖的OnDraw成員函數(shù).OnPaint最后也要調(diào)用OnDraw,因此一般在OnDraw函數(shù)中進(jìn)行繪制,。


The WM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called.

在OnPaint中,將調(diào)用BeginPaint,,用來(lái)獲得客戶(hù)區(qū)的顯示設(shè)備環(huán)境,,并以此調(diào)用GDI函數(shù)執(zhí)行繪圖操作。在繪圖操作完成后,,將調(diào)用EndPaint以釋放顯示設(shè)備環(huán)境,。而OnDraw在BeginPaint與EndPaint間被調(diào)用。

1) 在mfc結(jié)構(gòu)里OnPaint是CWnd的成員函數(shù). OnDraw是CView的成員函數(shù).
2) OnPaint()調(diào)用OnDraw(),,OnPrint也會(huì)調(diào)用OnDraw(),,所以O(shè)nDraw()是顯示和打印的共同操作。

OnPaint是WM_PAINT消息引發(fā)的重繪消息處理函數(shù),,在OnPaint中會(huì)調(diào)用OnDraw來(lái)進(jìn)行繪圖,。OnPaint中首先構(gòu)造一個(gè)CPaintDC類(lèi)得實(shí)例,然后一這個(gè)實(shí)例為參數(shù)來(lái)調(diào)用虛函數(shù)OnPrepareDC來(lái)進(jìn)行一些繪制前的一些處理,,比設(shè)置映射模式,,最后調(diào)用OnDraw。而OnDraw和OnPrepareDC不是消息處理函數(shù),。所以在不是因?yàn)橹乩L消息所引發(fā)的OnPaint導(dǎo)致OnDraw被調(diào)用時(shí),,比如在OnLButtonDown等消息處理函數(shù)中繪圖時(shí),要先自己調(diào)用OnPrepareDC,。
至于CPaintDC和CClientDC根本是兩回事情 CPaintDC是一個(gè)設(shè)備環(huán)境類(lèi),,在OnPaint中作為參數(shù)傳遞給OnPrepareDC來(lái)作設(shè)備環(huán)境的設(shè)置。真正和CClientDC具有可比性的是CWindowDC,,他們一個(gè)是描述客戶(hù)區(qū)域,,一個(gè)是描述整個(gè)屏幕。
如果是對(duì)CVIEW或從CVIEW類(lèi)派生的窗口繪圖時(shí)應(yīng)該用OnDraw,。

OnDraw()和OnPaint()有什么區(qū)別呢,?
首先:我們先要明確CView類(lèi)派生自CWnd類(lèi)。而OnPaint()是CWnd的類(lèi)成員,,同時(shí)負(fù)責(zé)響應(yīng)WM_PAINT消息,。OnDraw()是CVIEW的成員函數(shù),并且沒(méi)有響應(yīng)消息的功能,。這就是為什么你用VC成的程序代碼時(shí),,在視圖類(lèi)只有OnDraw沒(méi)有OnPaint的原因。而在基于對(duì)話(huà)框的程序中,,只有OnPaint,。
其次:我們?cè)诘凇睹刻旄覍W(xué)MFC》3的開(kāi)始部分已經(jīng)說(shuō)到了。要想在屏幕上繪圖或顯示圖形,,首先需要建立設(shè)備環(huán)境DC,。其實(shí)DC是一個(gè)數(shù)據(jù)結(jié)構(gòu),,它包含輸出設(shè)備(不單指你17寸的純屏顯示器,還包括打印機(jī)之類(lèi)的輸出設(shè)備)的繪圖屬性的描述,。MFC提供了CPaintDC類(lèi)和CWindwoDC類(lèi)來(lái)實(shí)時(shí)的響應(yīng),,而CPaintDC支持重畫(huà)。當(dāng)視圖變得無(wú)效時(shí)(包括大小的改變,,移動(dòng),被遮蓋等等),,Windows 將 WM_PAINT 消息發(fā)送給它,。該視圖的OnPaint 處理函數(shù)通過(guò)創(chuàng)建 CPaintDC 類(lèi)的DC對(duì)象來(lái)響應(yīng)該消息并調(diào)用視圖的 OnDraw 成員函數(shù)。通常我們不必編寫(xiě)重寫(xiě)的 OnPaint 處理成員函數(shù),。
///CView默認(rèn)的標(biāo)準(zhǔn)的重畫(huà)函數(shù)
void CView::OnPaint() //見(jiàn)VIEWCORE.CPP
{

CPaintDC dc(this);
OnPrepareDC(&dc),;
OnDraw(&dc); //調(diào)用了OnDraw
}
///CView默認(rèn)的標(biāo)準(zhǔn)的OnPrint函數(shù)
void CView::OnPrint(CDC* pDC, CPrintInfo*)
{
ASSERT_VALID(pDC);
OnDraw(pDC); // Call Draw
}

既然OnPaint最后也要調(diào)用OnDraw,因此我們一般會(huì)在OnDraw函數(shù)中進(jìn)行繪制。下面是一個(gè)典型的程序,。
///視圖中的繪圖代碼首先檢索指向文檔的指針,,然后通過(guò)DC進(jìn)行繪圖調(diào)用。
void CMyView::OnDraw( CDC* pDC )
{

CMyDoc* pDoc = GetDocument();
CString s = pDoc->GetData();
GetClientRect( &rect ); // Returns a CString CRect rect;
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
}
最后:現(xiàn)在大家明白這哥倆之間的關(guān)系了吧,。因此我們一般用OnPaint維護(hù)窗口的客戶(hù)區(qū)(例如我們的窗口客戶(hù)區(qū)加一個(gè)背景圖片),,用OnDraw維護(hù)視圖的客戶(hù)區(qū)(例如我們通過(guò)鼠標(biāo)在視圖中畫(huà)圖)。當(dāng)然你也可以不按照上面規(guī)律來(lái),,只要達(dá)到目的并且沒(méi)有問(wèn)題,,怎么干都成。補(bǔ)充:我們還可以利用Invalidate(),ValidateRgn(),ValidateRect()函數(shù)強(qiáng)制的重畫(huà)窗口,,具體的請(qǐng)參考MSDN吧,。

OnDraw中可以繪制用戶(hù)區(qū)域。OnPaint中只是當(dāng)窗口無(wú)效時(shí)重繪不會(huì)保留CClientDC繪制的內(nèi)容,。

這兩個(gè)函數(shù)有區(qū)別也有聯(lián)系:

1,、區(qū)別:OnDraw是一個(gè)純虛函數(shù),定義為virtual void OnDraw( CDC* pDC ) = 0; 而OnPaint是一個(gè)消息響應(yīng)函數(shù),,它響應(yīng)了WM_PANIT消息,,也是是窗口重繪消息。

2,、聯(lián)系:我們一般在視類(lèi)中作圖的時(shí)候,,往往不直接響應(yīng)WM_PANIT消息,而是重載OnDraw純虛函數(shù),,這是因?yàn)樵贑VIEW類(lèi)中的WM_PANIT消息響應(yīng)函數(shù)中調(diào)用了OnDraw函數(shù),,如果在CMYVIEW類(lèi)中響應(yīng)了WM_PAINT消息,不顯式地調(diào)用OnDraw函數(shù)的話(huà),,是不會(huì)在窗口重繪的時(shí)候調(diào)用OnDraw函數(shù)的,。

應(yīng)用程序中幾乎所有的繪圖都在視圖的 OnDraw 成員函數(shù)中發(fā)生,,必須在視圖類(lèi)中重寫(xiě)該成員函數(shù)。(鼠標(biāo)繪圖是個(gè)特例,,這在通過(guò)視圖解釋用戶(hù)輸入中討論,。)


OnDraw 重寫(xiě):
通過(guò)調(diào)用您提供的文檔成員函數(shù)獲取數(shù)據(jù)。
通過(guò)調(diào)用框架傳遞給 OnDraw 的設(shè)備上下文對(duì)象的成員函數(shù)來(lái)顯示數(shù)據(jù),。
當(dāng)文檔的數(shù)據(jù)以某種方式更改后,,必須重繪視圖以反映該更改。默認(rèn)的 OnUpdate 實(shí)現(xiàn)使視圖的整個(gè)工作區(qū)無(wú)效,。當(dāng)視圖變得無(wú)效時(shí),,Windows 將 WM_PAINT 消息發(fā)送給它。該視圖的 OnPaint 處理函數(shù)通過(guò)創(chuàng)建 CPaintDC 類(lèi)的設(shè)備上下文對(duì)象來(lái)響應(yīng)該消息并調(diào)用視圖的 OnDraw 成員函數(shù),。

當(dāng)沒(méi)有添加WM_PAINT消息處理時(shí),窗口重繪時(shí),由OnDraw來(lái)進(jìn)行消息響應(yīng)...當(dāng)添加WM_PAINT消息處理時(shí),窗口重繪時(shí),WM_PAINT消息被投遞,由OnPaint來(lái)進(jìn)行消息響應(yīng).這時(shí)就不能隱式調(diào)用OnDraw了.必須顯式調(diào)用( CDC *pDC=GetDC(); OnDraw(pDC); )..
隱式調(diào)用:當(dāng)由OnPaint來(lái)進(jìn)行消息響應(yīng)時(shí),系統(tǒng)自動(dòng)調(diào)用CView::OnDraw(&pDC).


想象一下,,窗口顯示的內(nèi)容和打印的內(nèi)容是差不多的,所以,,一般情況下,,統(tǒng)一由OnDraw來(lái)畫(huà)。窗口前景需要刷新時(shí),,系統(tǒng)會(huì)會(huì)調(diào)用到OnPaint,,而OnPaint一般情況下是對(duì)DC作一些初始化操作后,調(diào)用OnDraw(),。


OnEraseBkGnd(),,是窗口背景需要刷新時(shí)由系統(tǒng)調(diào)用的。明顯的一個(gè)例子是設(shè)置窗口的背景顏色(你可以把這放在OnPaint中去做,,但是會(huì)使產(chǎn)生閃爍的現(xiàn)象),。
至于怎么界定背景和前景,那要具體問(wèn)題具體分析了,,一般情況下,,你還是很容易區(qū)別的吧。

的確,,OnPaint()用來(lái)響應(yīng)WM_PAINT消息,,視類(lèi)的OnPaint()內(nèi)部根據(jù)是打印還是屏幕繪制分別以不同的參數(shù)調(diào)用OnDraw()虛函數(shù)。所以在OnDraw()里你可以區(qū)別對(duì)待打印和屏幕繪制,。
其實(shí),,MFC在進(jìn)行打印前后還做了很多工作,調(diào)用了很多虛函數(shù),,比如OnPreparePrint()等,。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多