下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、InvalidateRect只是增加重繪區(qū)域,在下次WM_PAINT的時(shí)候才生效InvalidateRect函數(shù)中的參數(shù)TRUE表示系統(tǒng)會(huì)在你畫(huà)之前用背景色將所選區(qū)域覆蓋一次,默認(rèn)背景色為白色,可以通過(guò)設(shè)置BRUSH來(lái)改變背景色。Invalidate()之后:(MFC的,順便了)OnPaint()->OnPrepareDC()->OnDraw()所以只是刷新在OnPaint()和OnDraw()函數(shù)中的繪圖語(yǔ)句。其它地方?jīng)]有影響。Invalidate標(biāo)記一個(gè)需要重繪的無(wú)效區(qū)域,并不意味著調(diào)用該函數(shù)后就立刻進(jìn)行重繪。類(lèi)似于PostMessage(WM_PAINT),需要處理到WM_P
2、AINT消息時(shí)才真正重繪。以為您Invalidate之后還有其他的語(yǔ)句正在執(zhí)行,程序沒(méi)有機(jī)會(huì)去處理WM_PAINT消息,但當(dāng)函數(shù)執(zhí)行完畢后,消息處理才得以進(jìn)行。Invalidate只是放一個(gè)WM_PAINT消息在隊(duì)列里,不做別的,所以只有當(dāng)當(dāng)前函數(shù)返回后,進(jìn)入消息循環(huán),取出WM_PAINT,才執(zhí)行PAINT,所以不管Invalidate放哪里,都是最后的。InvalidateRect(hWnd,&rect,TRUE);向hWnd窗體發(fā)出WM_PAINT的消息,強(qiáng)制客戶區(qū)域重繪制,rect是你指定要刷新的區(qū)域,此區(qū)域外的客戶區(qū)域不被重繪,這樣防止客戶區(qū)域的一個(gè)局部的改動(dòng),而導(dǎo)致整個(gè)客戶區(qū)
3、域重繪而導(dǎo)致閃爍,如果最后的參數(shù)為T(mén)RUE,則還向窗體發(fā)送WM_ERASEBKGND消息,使背景重繪,當(dāng)然在客戶區(qū)域重繪之前。UpdateWindow只向窗體發(fā)送WM_PAINT消息,在發(fā)送之前判斷GetUpdateRect(hWnd,NULL,TRUE)看有無(wú)可繪制的客戶區(qū)域,如果沒(méi)有,則不發(fā)送WM_PAINT如果希望立即刷新無(wú)效區(qū)域,可以在調(diào)用InvalidateRect之后調(diào)用UpdateWindow,如果客戶區(qū)的任一部分無(wú)效,則UpdateWindow將導(dǎo)致Windows用WM_PAINT消息調(diào)用窗口過(guò)程(如果整個(gè)客戶區(qū)有效,則不調(diào)用窗口過(guò)程)。這一WM_PAINT消息不進(jìn)入消息隊(duì)列,
4、直接由WINDOWS調(diào)用窗口過(guò)程。窗口過(guò)程完成刷新以后立刻退出,WINDOWS將控制返回給程序中UpdateWindow調(diào)用之后的語(yǔ)句。(windows程序設(shè)計(jì)第5版 P98)UpdateData()順便說(shuō)下,這個(gè)函數(shù)不是刷新界面用的。UpdateData();參數(shù)為FALSE時(shí),將界面上控件綁定的變量的數(shù)據(jù)導(dǎo)到控件內(nèi),參數(shù)為T(mén)RUE時(shí),導(dǎo)入方向則相反Invalidate與WM_PAINT之間的關(guān)系 系統(tǒng)會(huì)在多個(gè)不同的時(shí)機(jī)發(fā)送WM_PAINT消息:當(dāng)?shù)谝淮蝿?chuàng)建一個(gè)窗口時(shí),當(dāng)改變窗口的大小時(shí),當(dāng)把窗口從另一個(gè)窗口背后移出時(shí),當(dāng)最大化或最小化窗口時(shí),等等,這些動(dòng)作都是由系統(tǒng)管理的,應(yīng)用只是被動(dòng)地接
5、收該消息,在消息處理函數(shù)中進(jìn)行繪制操作;大多數(shù)的時(shí)候應(yīng)用也需要能夠主動(dòng)引發(fā)窗口中的繪制操作,比如當(dāng)窗口顯示的數(shù)據(jù)改變的時(shí)候,這一般是通過(guò)InvalidateRect和InvalidateRgn函數(shù)來(lái)完成的。InvalidateRect和InvalidateRgn把指定的區(qū)域加到窗口的Update Region中,當(dāng)應(yīng)用的消息隊(duì)列沒(méi)有其他消息時(shí),如果窗口的Update Region不為空時(shí),系統(tǒng)就會(huì)自動(dòng)產(chǎn)生WM_PAINT消息。 系統(tǒng)為什么不在調(diào)用Invalidate時(shí)發(fā)送WM_PAINT消息呢?又為什么非要等應(yīng)用消息隊(duì)列為空時(shí)才發(fā)送WM_PAINT消息呢?這是因?yàn)橄到y(tǒng)把在窗口中的繪制操作當(dāng)作一
6、種低優(yōu)先級(jí)的操作,于是盡可能地推后做,這樣有利于提高繪制的效率:在兩個(gè)WM_PAINT消息之間多個(gè)Invalidate調(diào)用使之失效的區(qū)域就會(huì)被累加起來(lái),然后在一個(gè)WM_PAINT消息中一次得到更新,不僅能避免多次重復(fù)地更新同一區(qū)域,也優(yōu)化了應(yīng)用的更新操作。像這種通過(guò)InvalidateRect和InvalidateRgn來(lái)使窗口區(qū)域無(wú)效,依賴于系統(tǒng)在合適的時(shí)機(jī)發(fā)送WM_PAINT消息的機(jī) 制實(shí)際上是一種異步工作方式,也就是說(shuō),在無(wú)效化窗口區(qū)域和發(fā)送WM_PAINT消息之間是有延遲的;有時(shí)候這種延遲并不是我們希望的,這時(shí)我們當(dāng)然可以在無(wú)效化窗口區(qū)域后利用SendMessage發(fā)送一條WM_PAI
7、NT消息來(lái)強(qiáng)制立即重畫(huà),但不如使用Windows GDI為我們提供的更方便和強(qiáng)大的函數(shù):UpdateWindow和RedrawWindow。UpdateWindow會(huì)檢查窗口的Update Region,當(dāng)其不為空時(shí)才發(fā)送WM_PAINT消息;RedrawWindow則給我們更多的控制:是否重畫(huà)非客戶區(qū)和背景,是否總是發(fā)送WM_PAINT消息而不管Update Region是否為空等CClientDC、CPaintDC、CWindowDC類(lèi)、WM_PAINT消息首先說(shuō)一下什么是DC(設(shè)備描述表) 解:Windows應(yīng)用程序通過(guò)為指定設(shè)備(屏幕,打印機(jī)等)創(chuàng)建一個(gè)設(shè)備描述表(Device Con
8、text, DC)在DC表示的邏輯意義的“畫(huà)布”上進(jìn)行圖形的繪制。DC是一種包含設(shè)備信息的數(shù)據(jù)結(jié)構(gòu),它包含了物理設(shè)備所需的各種狀態(tài)信息。Win32程序在繪制圖形之前需要獲取DC的句柄HDC,并在不繼續(xù)使用時(shí)釋放掉。 在c+ 編程中常會(huì)見(jiàn)到HDC,CDC,CClientDC,CPaintDC,CWindowDC這樣的類(lèi) HDC是DC的句柄,API中的一個(gè)類(lèi)似指針的數(shù)據(jù)類(lèi)型. CDC是MFC的DC的一個(gè)類(lèi) CDC等設(shè)備上下分類(lèi),都含有一個(gè)類(lèi)的成員變量:m_Hdc;即HDC類(lèi)型的句柄. 下面說(shuō)下一些細(xì)點(diǎn)的知識(shí)點(diǎn) CClientDC,CWindowDC 區(qū)別不大, 可以說(shuō) CWindowDC包含了CC
9、lientDC 就拿記事本來(lái)說(shuō) CClientDC 就只是白白的我們可以編輯文字的那個(gè)區(qū)域是 客戶區(qū) CWindowDC 除了上面說(shuō)的白白區(qū)域, 還包括菜單欄和工具欄等 CClientDC和CWindowDC 與 CPaintDC 的區(qū)別大點(diǎn) 在DC的獲取方面 CClientDC和CWindowDC 使用的是并只能是 GetDC 和 ReleaseDC CPaintDC 使用的是并只能是 BeginPaint 和 EndPaint CPaintDC 只能用在響應(yīng) WM_PAINT 事件 CClientDC,CWindowDC 只能用在響應(yīng) 非WM_PAINT 事件 關(guān)于 WM_PAINT 事件
10、 系統(tǒng)會(huì)在多個(gè)不同的時(shí)機(jī)發(fā)送WM_PAINT消息:當(dāng)?shù)谝淮蝿?chuàng)建一個(gè)窗口時(shí),當(dāng)改變窗口的大小時(shí),當(dāng)把窗口從另一個(gè)窗口背后移出時(shí),當(dāng)最大化或最小化窗口時(shí),等等,這些動(dòng)作都是由系統(tǒng)管理的,應(yīng)用只是被動(dòng)地接收該消息,在消息處理函數(shù)中進(jìn)行繪制操作;大多數(shù)的時(shí)候應(yīng)用也需要能夠主動(dòng)引發(fā)窗口中的繪制操作,比如當(dāng)窗口顯示的數(shù)據(jù)改變的時(shí)候,這一般是通過(guò)InvalidateRect和InvalidateRgn函數(shù)來(lái)完成的。InvalidateRect和InvalidateRgn把指定的區(qū)域加到窗口的Update Region中,當(dāng)應(yīng)用的消息隊(duì)列沒(méi)有其他消息時(shí),如果窗口的Update Region不為空時(shí),系統(tǒng)就會(huì)自
11、動(dòng)產(chǎn)生WM_PAINT消息。 系統(tǒng)為什么不在調(diào)用Invalidate時(shí)發(fā)送WM_PAINT消息呢?又為什么非要等應(yīng)用消息隊(duì)列為空時(shí)才發(fā)送WM_PAINT消息呢?這是因?yàn)橄到y(tǒng)把在窗口中的繪制操作當(dāng)作一種低優(yōu)先級(jí)的操作,于是盡可能地推后做。不過(guò)這樣也有利于提高繪制的效率:兩個(gè)WM_PAINT消息之間通過(guò)InvalidateRect和InvaliateRgn使之失效的區(qū)域就會(huì)被累加起來(lái),然后在一個(gè)WM_PAINT消息中一次得到更新,不僅能避免多次重復(fù)地更新同一區(qū)域,也優(yōu)化了應(yīng)用的更新操作。像這種通過(guò)InvalidateRect和InvalidateRgn來(lái)使窗口區(qū)域無(wú)效,依賴于系統(tǒng)在合適的時(shí)機(jī)發(fā)送W
12、M_PAINT消息的機(jī)制實(shí)際上是一種異步工作方式,也就是說(shuō),在無(wú)效化窗口區(qū)域和發(fā)送WM_PAINT消息之間是有延遲的;有時(shí)候這種延遲并不是我們希望的,這時(shí)我們當(dāng)然可以在無(wú)效化窗口區(qū)域后利用SendMessage 發(fā)送一條WM_PAINT消息來(lái)強(qiáng)制立即重畫(huà),但不如使用Windows GDI為我們提供的更方便和強(qiáng)大的函數(shù):UpdateWindow和RedrawWindow。UpdateWindow會(huì)檢查窗口的Update Region,當(dāng)其不為空時(shí)才發(fā)送WM_PAINT消息;RedrawWindow則給我們更多的控制:是否重畫(huà)非客戶區(qū)和背景,是否總是發(fā)送WM_PAINT消息而不管Update Re
13、gion是否為空等。 CDC及其派生類(lèi)的繼承視圖: CObject public |-CDC public |-|-CClientDC public |-|-CPaintDC public |-|-CWindowDC public |-|-CMetaFileDC (注意: 除CMetaFileDC以外的三個(gè)派生類(lèi)用于圖形繪制.) CDC類(lèi)定義了一個(gè)設(shè)備描述表相關(guān)的類(lèi),其對(duì)象提供成員函數(shù)操作設(shè)備描述表進(jìn)行工作,如顯示器,打印機(jī),以及顯示器描述表相關(guān)的窗口客戶區(qū)域。 通過(guò)CDC的成員函數(shù)可進(jìn)行一切繪圖操作。CDC提供成員函數(shù)進(jìn)行設(shè)備描述表的基本操作,使用繪圖工具, 選擇類(lèi)型安全的圖形設(shè)備結(jié)構(gòu)(GD
14、I),以及色彩,調(diào)色板。除此之外還提供成員函數(shù)獲取和設(shè)置繪圖屬性,映射,控制視口,窗體范圍,轉(zhuǎn)換坐標(biāo),區(qū)域操作,裁減,劃線以及繪制簡(jiǎn)單圖形(橢圓,多邊形等)。成員函數(shù)也提供繪制文本,設(shè)置字體,打印機(jī)換碼,滾動(dòng), 處理元文件。 其派生類(lèi): 1.PaintDC: 封裝BeginPaint和EndPaint兩個(gè)API的調(diào)用。 (1)用于響應(yīng)窗口重繪消息(WM_PAINT)是的繪圖輸出。 (2)CPaintDC在構(gòu)造函數(shù)中調(diào)用BeginPaint()取得設(shè)備上下文,在析構(gòu)函數(shù)中調(diào)用EndPaint()釋放設(shè)備上下文。EndPaint()除了釋放設(shè)備上下文外,還負(fù)責(zé)從消息隊(duì)列中清除WM_PAINT消息。因此,在處理窗口重畫(huà)時(shí),必須使用CPaintDC,否則WM_PAINT消息無(wú)法從消息隊(duì)列中清除,將引起不斷的窗口重畫(huà)。 (3)CPaintDC也只能用在WM_PAINT消息處理之中。2.CClientDC(客戶區(qū)設(shè)備上下文): 處理顯示器描述表的相關(guān)的窗體客戶區(qū)域。 用于客戶區(qū)的輸出,與特定窗口關(guān)聯(lián),可以讓開(kāi)發(fā)者訪問(wèn)目標(biāo)窗口中客戶區(qū),其構(gòu)造函數(shù)中包含了GetDC,析構(gòu)函數(shù)中包含了ReleaseDC。 3.CWindowDC: 處理顯示
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度藥品研發(fā)項(xiàng)目質(zhì)量監(jiān)督與醫(yī)療器械研發(fā)合作合同3篇
- 《湖南師范大學(xué)》課件
- 意義未明的單克隆免疫球蛋白病病因介紹
- 新疆警察學(xué)院《材料成型工藝與裝備》2023-2024學(xué)年第一學(xué)期期末試卷
- 污水處理廠bot項(xiàng)目特許經(jīng)營(yíng)協(xié)議示范文本模板
- 夢(mèng)幻臥室室內(nèi)設(shè)計(jì)中的臥室布置技巧
- 浴場(chǎng)勞動(dòng)合同范例
- 船舶拆解銷(xiāo)毀合同范例
- 廣州住宅合同范例
- 租擺養(yǎng)護(hù)合同范例
- 【9歷期末】安徽省淮北市2023-2024學(xué)年九年級(jí)上學(xué)期期末歷史試題
- 2024年度物流園區(qū)運(yùn)營(yíng)承包合同范本3篇
- 投資控股合同
- 2024-2025學(xué)年上學(xué)期武漢小學(xué)語(yǔ)文六年級(jí)期末模擬試卷
- 2023-2024學(xué)年貴州省貴陽(yáng)外國(guó)語(yǔ)實(shí)驗(yàn)中學(xué)八年級(jí)(上)期末數(shù)學(xué)試卷(含答案)
- 2025版國(guó)家開(kāi)放大學(xué)專(zhuān)本科《計(jì)算機(jī)應(yīng)用基礎(chǔ)》一平臺(tái)在線形考任務(wù) (形考作業(yè)一至三)試題及答案
- 古代漢語(yǔ)專(zhuān)題-003-國(guó)開(kāi)機(jī)考復(fù)習(xí)資料
- 【MOOC】信號(hào)與系統(tǒng)-西北工業(yè)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《半導(dǎo)體的基本知識(shí)》教學(xué)設(shè)計(jì)
- 科研團(tuán)隊(duì)協(xié)作管理制度
- 拓展訓(xùn)練融入初中體育教學(xué)的創(chuàng)新策略與實(shí)施路徑
評(píng)論
0/150
提交評(píng)論