自制嵌入式GUI 【前1-3篇】-基於freeRTOS

自制GUI第4篇:https://blog.csdn.net/shungry/article/details/78659613

自制GUI第5篇:https://blog.csdn.net/shungry/article/details/85246023

———————————————————————分割線—————————————————————————

本篇文章我在野火論壇中發佈過,現在修改下發到這裏(裏面可能會有很多邏輯不通的地方請見諒)

第一篇

因爲接近畢業,在老師的推薦下做了個GUI,花了將近一個月的時間,從一點都不瞭解C++,到用C++做出一個簡單的消息機制,以及簡單的控件庫,發帖紀念一下。雖然還是簡單的不行,包括各個控件的重繪機制都有些BUG 重繪的控件會重新改過所有的控件-----尷尬。想消息處理機制依然有些混亂,借鑑了miniGui的窗口過程方式,但是人家畢竟是pc上的大型GUI,理解不大來,期間也看了QT,最後才加了自己理解用孩子兄弟二叉樹表示了整個GUI的結構,現在發現了許多因這種方式的不足,但是一條路走到黑了。
二叉樹:
 
目前的GUI測試界面:
 
list控件:(實在是簡陋)
鍵盤:(只支持英文)
 
對話框:
 

圖中還有 單選框,複選框,滑塊和進度條。---第一次發帖,確實不會排版,大牛們見諒哈。。
現在自己的腦子一片混亂,沒發做下去了。我老師還想我增強可移植性。。。😢



補充一句:我現在還在完善代碼,如果不出意外,本週末或下週會發最新的情況。
中間還有很多BUG,我也不知道自己能做成什麼樣。
有興趣的各位可以加入一起完善代碼。---------------------但是C++代碼真的寫的難看

第二篇


之前的GUI實現方法都沒講,以後慢慢講把。但是代碼都公開,雖然很難看。但是很歡迎大家提意見。
這裏還是感謝火哥支持,讓我有了做下去的動力!!!
之前留下了一些自己很難解決的問題,這次大概全部都解決了(但是有些都是走擦邊球
上次發的問題 :
     問題 1:當某個控件註冊重繪後再消失時,桌面還留下了之前的控件的圖案,之前解決方法在控件銷售時重繪桌面(這樣當所有小按鍵消失時都會導致背景重繪,所以會出現屏幕經常閃動)
     解決 :在呼出要覆蓋當前界面的控件時,先把要覆蓋的數據保存到新建的buffer裏面,再覆蓋,噹噹前控件回收時再從buffer中把數據讀回。如圖:(字醜不要嫌棄)
     
     問題 2:當有呼出一些控件時(如鍵盤),在去按其他被鍵盤覆蓋的控件時,又會把鍵盤覆蓋。(這個不符合邏輯,按理說按鍵應該時最高層的,誰都無法覆蓋它。)
                 問題的本身是所有的控件不知道誰把誰覆蓋了,各個的顯示層次是怎麼樣的。
     解決 :當創建,或呼出一個新的控件時,把自己進行採樣成一個個點,會遍歷控件樹(上一篇稍微提過,我是用樹來實現相應關係的)去一個個比對是否採樣點在控件範圍中,若是則把控件標記爲被覆蓋,設置覆蓋其的對象是新的控件。這樣當被覆蓋的控件被點按時,上面的控件也會被刷新,保證一直被覆蓋。如圖:(這個會一點出現閃屏,但是是我目前不大改代碼下最好的方法了。)
       
     問題 3:一些按鈕會出現bug,導致GUI奔潰,卡帶。(這個想想就害羞 0 0 ----不完整的就發出來了。)

     這個純屬自己沒考慮好,現在已經解決。

注意: 左上角的‘ X ’是我測試用的 不要按得太頻繁,會出現髒圖像。
       

之後將要實現 1.佈局類(可以方便的佈局控件,不需要計算絕對座標)
                    2.重寫繪畫函數(現在都是使用火哥的函數,爲了方便GUI其他板子方便移植)
                    3.完成可移植性
我用Cpp寫的所以堆的要求較大,因爲是樹結構我中間用了遞歸,所以棧的要求也不小。

第三篇

最近去投簡歷了,就沒有太多的進展(添加了佈局類),這次我就大概記錄自己做這個GUI的思路吧。
1.
在第一篇的時候我簡單的講過我這個是基於 孩子兄弟二叉樹 的映像表達。
如圖:(二叉樹中,左邊的爲孩子,右邊的爲兄弟)
 
有什麼好處呢?當時覺得比較容易管理,而且思路清晰。
如圖:這樣一個根節點會有兩個孩子窗口(WinA,WinB),然後窗口中又有孩子控件(a,b1,b2),WinA和WinB是兄弟關係,b1和b2也是兄弟關係,查找起來就很方便。
 
因爲我選擇的是二叉樹,所以當要重繪全部的時候,只要用樹的先序遍歷就能把所有的窗口控件全部都畫出來。如果我想要註銷某一個窗口或控件,通過把他們從樹中分離,其他連帶的孩子也會背分離,同樣的添加也很方便。
如圖:(便於遍歷,刪除,添加,這是我的主要目的)
 
上面講的是GUI的結構存儲情況。
下面的GUI控件中的消息機制,我有點參考MiniGUI(其實也沒怎麼研究MiniGUI >_< 大神們莫見怪)

2.
TGUI的所有控件的交互都是基於消息機制的。
怎麼說呢,就是每一個線程會維護一個消息隊列。(我這裏用的是freeRTOS 線程自帶的隊列--原理一樣)
然後每個控件/窗口都會有 窗口過程函數 (這需要我們自己實現),用來實現觸發該控件/窗口時應該做的處理過程。
如圖:描述了一個 創建控件/窗口 註冊 重繪 循環接收信息處理 的全過程。(當然也可以自己動態創建,這個是後話了 其實原理差不多)
 

3.
這一次我多添加了佈局類(以後添加控件,佈局控件比較方便吧)參考於Java的佈局類。我主要實現了 
流式佈局(flowLayout):一個一個控件按順序排列,一行排列不下就換行接着排列,到時只需用addWin函數添加控件就好
 
邊框佈局(borderLayout):把指定的區域分成東、西、南、北、中五個區域存放控件
 
網格佈局(gridLayout):這個顧名思義就把窗口劃分爲大小一樣的網格,用控件進行排列(都繼承一個layout基類,用的方法都差不多。)
 

還有可移植性還是沒想好,畫圖的函數還沒做。主要就是畫圖函數和後面的LCD驅動各有不同,還在想中。
最後還是貼上我的資源:
GitHub:https://github.com/909452726/TGUI
百度網盤:http://pan.baidu.com/s/1pLyZH0n
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章