MiniGUI視窗剪下分析

2021-04-13 02:04:59 字數 1176 閱讀 7843

minigui的視窗剪下機制在眾多嵌入式gui中還是比較有特點的。 它基於這樣一種理論,每個gdi原子操作都支援剪下,那麼基於這些操作來完成的一次繪製也是支援剪下的。而很多gui實際上都是為每個視窗開闢了一塊buffer,gdi原子操作本身不需要支援剪下,先將圖形繪製到buffer上,然後再將buffer區域性輸出到前台(如果你將這個過程也定義為gdi操作,那可能準確一點的說法是除blit之外的操作都是不支援剪下的)。不能說minigui這種做法就一定好,凡事都沒有絕對,只能說它比較有特點,在某些情況下效率的確比buffer級剪下要高,而且資源占用少。

minigui的比較完整的開源版本是1.3.3,雖然1.6.2-str也是乙個開源版本,但比較關鍵的newgdi和newgal模組不包含在其中,所以本文選擇了1.3.3做為分析物件。1.3.3分為lite和thread兩種執行模式,但lite模式下不能完整的支援多視窗剪下,所以分析範圍再次細小到thread模式。

thread模式,即執行緒模式,每個應用程式都以執行緒的方式執行,共享程序空間。這種模式是典型的嵌入式設計,很多小巧的嵌入式os有且只有執行緒這個概念,特別是那些為沒有mmu的處理器設計的os。

要分析視窗剪下,首先要搞明白minigui的視窗是如何儲存的。其實我們分析任何一段**都無非是從資料結構和演算法兩個角度來觀察的,資料結構是靜的,演算法是動的,也就是所謂的儲存設計和執行設計。

minigui單個視窗在內部儲存結構大致如下,擷取自internal.h,

typedef struct _mainwin

mainwin;

minigui的視窗分客戶區和非客戶區,這點和windows是一樣的,(left, top, right, bottom)為主視窗大小,(cl,ct,cr,cb)為客戶區大小。

一般來說螢幕上會出現多個視窗,而且相互之間會有層疊關係。多個視窗在記憶體中被組織成視窗棧,minigui中有兩個視窗棧,乙個是普通視窗棧(desktop.c中使用靜態全域性變數sg_mainwinzorder儲存),另乙個是topmost視窗棧(desktop.c中使用靜態全域性變數sg_topmostwinzorder儲存)。其實在我看來完全沒有必要分解成兩個視窗棧,使用同乙個視窗棧保留兩個指標就可以了,這樣就不至於在無效區域重繪時要判斷兩個變數,當然這只是設計上的乙個小問題。

以乙個例子來說明minigui是如何完成視窗剪下計算的。在這個例子中我們假設螢幕上有兩個視窗,關係如下圖所示,

當視窗a消失的時候,b視窗原來被

VC 切分視窗

vc 中建立切分視窗 1.使用嚮導建立sdi窗體,一切均取預設值 2.在cmainframe類中增加切分控制項成員 csplitterwnd m wndsplitter 3.在cmainframe類的oncreateclient方法 若沒有此方法使用 增加虛函式 嚮導新增 中增加如下 並將retur...

關於minigui的面板視窗

1.的構成 minigui 中的 介面主要由包含在 視窗中的 主介面和各種 元素組成。皮 膚視窗是 所依附的視窗,必須依附在某個視窗上才能顯示出來。主介面又是皮 膚元素的依附所在。而 元素是指構成 介面的各種介面元素,包括按鈕 button 標 籤 label 和滑條 slider 等,當然,它們基...

Hive 視窗分析函式

1.lag col,n,default 用於統計視窗內往上第n行值 第乙個引數為列名,第二個引數為往上第n行 可選,預設為1 第三個引數為預設值 當往上第n行為null時候,取預設值,如不指定,則為null 2.lead col,n,default 用於統計視窗內往下第n行值 第乙個引數為列名,第二...