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