1. 程式人生 > 其它 >GUI重新整理機制研究(四) 髒矩形更新

GUI重新整理機制研究(四) 髒矩形更新

前面走到了CoreRoot_UpdateCanvas裡面,在此之前已經完成了髒區的計算,下面就是要進行鍼對髒區的更新了,一起來觀觀這個是怎麼實現的

一些細節暫時不去深究,抓住主要的地方,可以看到裡面是一個for迴圈,對每個髒區執行一次

CoreView_Draw, 這裡注意不要誤入歧途,實際上實現走的是CoreRoot_Draw.

我們先看一下這個函式的description, 幫助我們搞清楚它要做什麼

好吧,看描述,這個所謂的Canvas的引數,就是最終渲染的結果呈現的地方,aClip是指定一個區域,超過這個區域的內容會被Clip掉。

在CoreRoot_Draw中, 首先是對當前View的父頁面的這個位置進行了一次FillRectangle操作。

然後就呼叫CoreGroup_Draw, 在CoreGroup_Draw中,強行把_this轉成了(CoreGroup)_this, 這裡我們知道CoreGroup是個基類,其它的比如ViewsRectangle和ViewsText 等都是繼承自CoreRectView, CoreRectView又是繼承自CoreView

呼叫了CoreGroup_drawContent, 這裡就說的通為啥之前的Calltrace裡面會走到這個函式裡了

在這個函式裡面,首先一個比較引人注意的操作就是

CoreView view = _this->first; (也就是說Coregroup中有一個view list, 其first成員指向首個節點)

然後就是在一個while迴圈中,完成對viewlist的遍歷,我們看下遍歷是要做什麼

這裡關鍵的操作是拿著view list中的每個view去測試一下是否和clip區域有交集,如果有,說明,這個view也要更新

因為是從first開始,所以大膽猜測,first的zorder是最小的,這樣就是從下到上依次把所有的view髒掉的部分重新畫上

這裡是通過CoreView__Draw(view, ...) 去draw的,還記得一開始也是這個嗎,不同的是一開始給的引數是CoreRoot _this

現在則是各個CoreView子類的自己具體的Draw,

(CoreView)_this->_VMT->Draw(xxxx)

這樣就最終走到了每個具體的View自己的最終的Draw.

結合前面第二部分說的渲染部分的實現,這樣總算是形成了一個初步的閉環