適用于移動終端的GUI設(shè)計與實現(xiàn)
要在圖形輸出設(shè)備上繪制圖形,在調(diào)用圖形輸出函數(shù)時,均要求指定經(jīng)初始化的圖形設(shè)備上下文(Device Context,DC),也稱作設(shè)備環(huán)境。設(shè)備上下文是連接應(yīng)用程序、設(shè)備驅(qū)動程序以及輸出設(shè)備的紐帶,見圖3。設(shè)備上下文包含許多屬性,當(dāng)需要修改這些屬性時,只需調(diào)用一個GDI函數(shù)修改設(shè)備上下文中屬性的參數(shù)。
圖3. 設(shè)備上下文
一個圖形設(shè)備上下文所代表的含義很復(fù)雜,它起碼應(yīng)該包含如下內(nèi)容[5]:
? 該設(shè)備上下文本所在設(shè)備信息(顯示模式、色彩深度、顯存布局等等);
? 該設(shè)備上下文所代表的窗口以及該窗口被其他窗口剪切的信息
? 該設(shè)備上下文的基本操作對象(筆、刷子、字體、位圖、區(qū)域等),及其上下文信息;
? 由程序設(shè)定的局部信息(繪圖屬性、映射關(guān)系和局部剪切域等)。
2.2.2 繪圖函數(shù)
設(shè)備上下文的屬性決定了有關(guān)繪圖函數(shù)如何工作的細(xì)節(jié)。通過繪圖函數(shù)應(yīng)用程序能夠方便地畫出直線、矩形、圓、橢圓和其它復(fù)雜圖形,而不需直接與具體的輸出設(shè)備打交道。
2.2.3使用GDI對象的函數(shù)
當(dāng)調(diào)用繪圖函數(shù)時,使用當(dāng)前設(shè)備上下文中選擇的GDI對象來進(jìn)行繪圖。GDI共有筆、刷子、字體、位圖、區(qū)域和邏輯調(diào)色板六個對象。
例如可以通過在CreatePen、 CreatePenIndirect或ExtCreatePen函數(shù)中指定這些特征來建立一個邏輯畫筆,這些函數(shù)傳回一個邏輯畫筆的句柄。要使用這個畫筆,就要用SelectObject將畫筆句柄選進(jìn)設(shè)備內(nèi)容。這樣,畫任何線都使用這個畫筆,然后可以取消設(shè)備內(nèi)容中的畫筆選擇,并清除畫筆對象。清除畫筆對象是必要的,因為畫筆定義占用了分配的內(nèi)存空間。
除了畫筆以外,GDI對象還用于建立填入封閉區(qū)域的畫刷、字體、位圖以及GDI的其它一些方面。
2.3 消息隊列
移動終端產(chǎn)生的消息主要包括:按鍵事件消息、協(xié)議棧消息及自定義消息等。按鍵一般有12個標(biāo)準(zhǔn)電話按鍵、左右2個軟鍵、5個導(dǎo)航鍵(上、下、左、右、中) 、撥號鍵和掛機(jī)鍵,由此可產(chǎn)生對應(yīng)的短按鍵及長按鍵消息。按鍵的按下及釋放產(chǎn)生按鍵事件,對比鍵碼表對按鍵事件進(jìn)行解碼,獲取正確的按鍵消息。按鍵消息經(jīng)消息過濾后送往當(dāng)前焦點窗口。GSM 協(xié)議棧消息是由手機(jī)平臺產(chǎn)生的送往消息隊列的協(xié)議棧消息,主要是網(wǎng)絡(luò)事件及手機(jī)狀態(tài)的響應(yīng)消息,包括所有對SIM卡、網(wǎng)絡(luò)狀態(tài)、通話、短消息等的響應(yīng)消息。協(xié)議棧消息需傳送到賦于系統(tǒng)窗口屬性的窗口,但窗口并不需要對每一項協(xié)議棧消息進(jìn)行處理,只依據(jù)窗口函數(shù)的具體屬性定義進(jìn)行消息響應(yīng)。
GUI采用消息驅(qū)動機(jī)制,把上面這些消息收集在一個消息隊列中,然后將這些消息連同定時器和重畫消息一起放入應(yīng)用程序消息隊列中。應(yīng)用程序消息隊列是屬于各個應(yīng)用程序所有的先進(jìn)先出隊列。但是定時器消息和重畫消息保留在隊列中直到應(yīng)用程序處理完所有其它消息后才予以處理。GUI將屬于一個特定應(yīng)用程序的消息放入該應(yīng)用程序的消息隊列中,然后應(yīng)用程序讀取這些消息,并將它們發(fā)送給相應(yīng)的窗口函數(shù)。
評論