最近弄gui,非常郁悶,也看了很多前輩寫的東西,倆字——“難”,一個(gè)是代碼太多,看不進(jìn)去,再一個(gè)是函數(shù)嵌套的很復(fù)雜。而且大多都帶os,運(yùn)用在項(xiàng)目中的話,還得再弄個(gè)os,本來是想隨便找一個(gè)gui,修修改改,然后就直接用的,但現(xiàn)在不成了,沒辦法,只有應(yīng)著頭皮重新學(xué)。好在找了一個(gè)相對(duì)簡單的dx_gui。這個(gè)的簡單,在于可以在大循環(huán)中運(yùn)行,不用os。ucgui雖然據(jù)說可以,但移植就很復(fù)雜,需要改很多東西,那代碼看的頭都大了。所以一怒之下,放棄那個(gè)。不過那個(gè)還是比較不錯(cuò)的,支持窗口重疊,具體原理到現(xiàn)在也沒弄清。不過看看這些gui,倒明白了一些思路。下面就來分析一下。
起始這東西思想不是特別復(fù)雜,但弄起來這些窗口,控件,效果,各種響應(yīng)處理以及各類接口也是相當(dāng)復(fù)雜的。
那么首先來說說,gui與普通的畫圖函數(shù)有啥區(qū)別。雖然說,gui的意思是圖形用戶界面的大概念。如果利用普通的畫點(diǎn)畫線畫方函數(shù)組合成界面,也應(yīng)該算gui的范疇之中。但其實(shí)還是和普通的畫圖函數(shù)有一些區(qū)別,區(qū)別在于,對(duì)響應(yīng)的處理和接口的區(qū)別。我們暫且把gui分成宏觀和微觀來說,宏觀的gui 是一個(gè)定義,一個(gè)概念,我們不討論。我們討論的是程序中的微觀gui。微觀的gui首先是把功能當(dāng)成函數(shù)封裝了起來。比如,如果要用普通畫圖函數(shù)畫一個(gè)窗口,那么首先,你要畫一個(gè)矩形,然后畫按鈕,然后畫各類的空間。最后,你把這些東西顯示在lcd中,從外觀上來看,你可以把它定義為一個(gè)窗口。而gui 呢?則不然,他要畫一個(gè)窗口,怎么辦。直接用一個(gè)函數(shù)。即畫窗口函數(shù)。比如GUI_Draw_window(&Main_window);而這個(gè)函數(shù)的原形是啥樣的呢?void GUI_Draw_window(style *the_window );當(dāng)然,這個(gè)函數(shù)只是簡單的用法,更為復(fù)雜的gui可能定義不同。但意思我想應(yīng)該是差不多的。那就是畫一個(gè)窗口,這個(gè)窗口是啥樣的呢?那就是一個(gè) style結(jié)構(gòu)的參數(shù)。這個(gè)style結(jié)構(gòu)中可以定義窗口的大小,坐標(biāo),背景顏色,等等一系列參數(shù);蛘呤窍犬嬕粋(gè)視窗,然后再視窗中放置各種控件和文字,最后將這個(gè)視窗形成的圖像顯示到lcd,不管怎么說,都是把窗口變成一個(gè)概念封裝在一起最后顯示到lcd上。還有一個(gè)區(qū)別,那就是響應(yīng)問題,既然是窗口,肯定要顯示信息,那么如何顯示信息呢?普通的繪圖函數(shù)是通過變量來顯示信息的。比如在窗口中單擊確定鍵,普通繪圖函數(shù)則是通過改變變量來解決這個(gè)問題的。比如if(a按鍵沒有按下)畫矩形a();else 畫矩形b;而gui則是通過回調(diào)會(huì)信息響應(yīng)函數(shù)來解決這個(gè)問題的,if(a按鍵沒有按下)信息響應(yīng)(a=0);else 信息響應(yīng) (a=1);然后窗口根據(jù)信息,來判斷顯示啥,這個(gè)例子看其來好像都都一樣,但是這是簡單的信息,如果信息多了,而且有很多種組合,判斷變量的方法就不好用了。如果你要顯示的信息很簡單,用顯示函數(shù)就可以,如果做復(fù)雜顯示的話,用gui比較方便,這看項(xiàng)目的功能需要。
說完了區(qū)別,在說幾個(gè)概念。
首先是窗口,窗口是界面的主要組成,大家應(yīng)該都不陌生。
控件,比如按鈕,滑動(dòng)條,可以對(duì)程序或窗口操作的東西叫控件。
信息處理機(jī)制,gui的信息處理是通過函數(shù)而不是變量來和窗口溝通的,比如按鍵,鼠標(biāo)等等,都是通過函數(shù)傳遞參數(shù),然后改變響應(yīng)的窗口。
還有就是繪制這些元素
gui也是通過繪圖函數(shù),我覺得,gui只不過是一個(gè)應(yīng)用層的繪圖函數(shù),他是要結(jié)果,而不要過程,但過程仍然需要繪圖函數(shù)來完成。你需要做的就是在gui的接口,輸入你需要的樣子。