新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 軟鍵盤產品界面顯示的通用程序設計

        軟鍵盤產品界面顯示的通用程序設計

        作者: 時間:2004-12-10 來源:網絡 收藏
        摘要:介紹如何利用狀態圖的分析結果把握待開發系統的軟結構,完成軟控制類

        關鍵詞:狀態圖 控制類 數據結構

        可視頻程序的一個重要特點是:有大量的窗口、對話框等界面與用戶進行交互,并根據用戶在界面上的操作進行相應的事務處理。設計良好的用戶界面不僅可以提高用戶與軟件的交互效率,而且可以減少用戶操作與控制狀態轉換出錯的概率。好的設計界面不但要注意屏幕布局,更在充分理解待完成工作的基礎上,快速地構架系統的有效結構,使編程人員有更多的精力去實現系統的處理功能。下面介紹一種在Nucleus仿真器MNT中快速實現界面設計的經驗。

        圖1 PDA產品的主界面和部分功能操作界面

        1 系統分析

        (1)問題的由來

        嵌入式系統是一種軟、硬件結合的產物。一個控制類嵌入式產品的軟件開發離不開它所依賴的硬件環境。如今有了仿真軟件的支持,使得嵌入式系統軟件與硬件的開發可以同時進行,也因為嵌入式開發工具的強大,越來越多的軟產品在不斷問世。無論是仿真開發硬產品,還是開發軟鍵盤產品,待開發軟件除界面之外,主要處理的是設備與外界環境的復雜交互。由于復合控制行為的數量和種類都不可預測,導致了這類軟件設計非常復雜,此時使用常規設計方法,難于充分保證實現每種控制行為的組合,更難于保證控制界面的逐級返回。例如,當開發圖1所示的PDA軟鍵盤產品時,其中每項功能的控制界面上都有眾多按鈕用于接受控制行為,根據用戶點擊行為的不同,進入下一級不同的界面,或處理不同的事務。盡管有產品可能將固定鍵盤做成一組固定的硬件按鈕,但無論怎樣,這類軟件都需要為不同的界面設計許多不同的控件,并處理控制行為對應的事務。因此,開發中快速地實現界面,可保證有更多的精力處理所有控制行為對應的事務。

        圖2 系統記束本部分狀態轉換圖

        (2)狀態圖

        美國ATI公司的Nucleus嵌入式操作系統是一個嵌入式系統開發包。該軟件包借助Visual C++的調試器和編譯器進行程序的調試與編譯,基本控制語句標準C語句。使用其中的Nucleus MNT仿真器提供的專用庫函數,可以實現產品開發。

        為了編寫PDA的控制軟件,首先分析整個產品的功能,并以狀態轉換圖進行描述。圖2是系統記事本部分狀態轉換圖。

        2 系統的實現

        2.1 數據結構的建立

        通過對狀態圖的分析得知,整個系統有38種功能不同的控件,共70個。在不同的界面上發生的不同控制行為決定了系統的不同轉移狀態,并啟動響應事務處理。假設全部的數據結構預先定義在pda_init.h文件中,為了完成系統設計,主要需要設計如下數據結構:控件數組、狀態控件鏈、顯示狀態鏈、顯示狀態棧。

        (1)控件數組

        在Nucleus MNT中,用Window CreateWindow(int wClass,char*ttl,int x,int y,int w,int h,int(*wndProc)(),unsigned long attrib)和CTRL *Control(Window wnd,int type,char name[],int x,int y,int w,int h,int id)函數,可分別創建窗口窗的各種控件,所以設計了一個二維int型控件數組。其中存儲的是70個控件的相關參數,函數調用時,直接引用控件數組的不同分量就可以顯示出不同的控制界面。控件數組的定義格式為:static int Controls[70][7];

         控件屬性偏移值LeftTopWidthHeightID
        Controls[X][Y]Y=0Y=1Y=2Y=3Y=4Y=5Y=6

        Controls[X][0]:控件屬性,表示控件的類型。例如,0表示按鈕,13表示文本輸入框,23表示圖片,29表示靜態文本框,51表示中英字符的三塊鍵盤,52表示數字小鍵盤,53表示號碼查詢鍵盤,54表示計算器鍵盤。

        Controls[X][1]:控件偏移植。作用是區分或設定同一類型不同控件的編號。編號從0開始。例如,對于系統中的17個按鈕可分別設置為

        {0,0,50,110,60,20,5501},

        {0,1,150,110,60,20,5502},

        ……

        {0,16,230,160,35,40,5517}

        系統的21個靜態文本框分別設置為

        {29,17,10,15,50,30,5601},

        {29,35,10,40,50,30,5619},

        ……

        {29,38,10,15,50,30,5622},

        偏移值指定的內容是需要顯示的字符串,如圖3所示。

        Controls[X][2]:控件距所處窗處左邊界的距離。

        Controls[X][3]:控件距所處窗體右邊界的距離。

        Controls[X][4]:控件的寬度。

        Controls[X][5]:控件的高度。

        Controls[X][6]:控件的標識號碼,為了系統調用方便而取的編號。

        圖4 界面控件鏈

        (2)狀態控件鏈

        控件鏈(static int StateControlList[53][6])是一個動態的單向鏈表結構。在應用程序初始化階段,根據對pda_init.h文件中定義的界面控件靜態數組的遍歷動態生成。當程序進入某個界面時,只要循環顯示該鏈表中的控件即可。

        Static int StateControlList[53][6]數組的具體定義格式如下:

         Y=0Y=1Y=2Y=3Y=4Y=5
        StateControlList[X][Y]控件1控件2控件3控件4控件5控件6
        StateControlList[1][6]464748490NU

        其中“控件1”、“控件2”……表示當前狀態的第一、第二等控件。數據“46”表示控件數組的第47個控件,與Controls[46][Y]數組中的內容相對應。“0”是控件結束標志,“NULL”表示沒有數據。

        為了處理方面,在程序初始化的過程中,假設這個靜態數組生成了一個單向鏈表數組,PDAStateControlsList[53]。具體格式如圖4所示。

        該鏈表的每個節點是一個pdacontrolslist型常量,具體結構如下:

        struct pdacontrolslist //以下的“X”為控件數組的編號

        {

        int propertyvalue; //控件屬性值,大小等于Controls[X][0]

        int default_flag; //缺省偏移值,大小等于Controls[X][1]

        int x; //控件距窗體左邊界位置,大小等于Controls[X][2]

        int y; //控件距離窗體上邊界位置,大小等于Controls[X][3]

        in w; //控件寬度,大小等于Controls[X][4]

        int h; //控件高度,大小等于Controls[X][5]

        int idvalue; //控件的id值,大小等于Controls[X][6]

        struct pdacontrolslist *next; //指向下一條記錄

        };

        (3)顯示狀態鏈

        系統各種狀態之間的轉換用顯示狀態鏈(static int ShowStateList[22][11])進行控制。它是一個動態結構的雙向鏈表,在應用程序初始化階段,遍歷pda_init.h文件中定義的狀態轉換順序靜態數組,動態生成該狀態鏈。這種數據結構為電話簿和記事本的添加和修改操作提供了方便。由于電話簿和記事本的操作狀態轉換是單向的,所以采用雙向鏈表結構實現線性狀態的前后續狀態轉換。

        Static int ShowStateList[22][11]數組的具體定義格式如下:

         Y=0Y=1Y=2Y=3Y=4 Y=11
        ShowStateList[X][Y]狀態1狀態2狀態3狀態4狀態5狀態11
        ShowStateList[10][11]3839400NULLNULL

        其中“狀態1,2,3……”依次表示當前狀態鏈的不同狀態。“0”是結束標志,“NULL”表示沒有數據。

        在程序初始化的過程中,由這個靜態數組生成一個雙向鏈表數組OperationStates[22]。雙向鏈表的每個節點數據域是一個整型常量。它的值等于與其相對應的狀態控件鏈數組(PDAStateControlsList[53])的下標值。例如,如果節點的數據域為12,則對應PDAStateControlsList[12]狀態控件鏈。具體的生成格式如圖5所示。

        (4)顯示狀態棧

        顯示狀態棧存放的數據是顯示狀態編號。具體數據是從初始狀態到達當前狀態所經過的所有狀態,棧數據處理由int StateStackPop()、intStateStackGet()、void StateStackPush(int a)三個函數實現。具體處理情況如圖6所示。

        1.2 編程實現

        有了以上一套數據結構之后,具體編寫程序代碼時,根據不同功能所要完成的任務和使用的數據結構,可歸類待編寫模塊,從而提供代碼復用率。如電話簿和記事本就可以共用同一套程序代碼。因此,關于PDA的所有系統模塊劃分如圖7所示。

        系統各個模塊間的連接用狀態棧以及一些公共變量實現,根據狀態棧的信息確定工作到了哪個狀態,根據公共變量獲得完成操作所需要的信息。程序每進入一個新模塊調用的處理函數,先屏蔽主界面上固定鍵盤內的所有按鈕,再顯示本界面的按鈕,最后將固定按鈕連接到進入模塊的處理函數中,實現固定鍵盤操作含義的轉變。

        3 小結

        利用狀態圖分析和以上定義的數據結構,可以進行任何界面的顯示。這種編程方法有兩大優點。

        ①快速方便地完成界面的任意修改。當需要改變界面時,只要改變控制數組中的值和控件靜態數組中的值即可,無需修改任何代碼。

        ②擴展嵌入式系統功能。只要進一步進行狀態圖分析,把新功能的狀態順序關系填寫到狀態鏈數組中,就可以完成新功能的進入和返回。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 和田市| 班戈县| 吴堡县| 灵山县| 兴安县| 库车县| 炉霍县| 吴忠市| 汽车| 丰城市| 安远县| 防城港市| 英超| 石景山区| 清丰县| 柘城县| 安陆市| 汶川县| 确山县| 沂源县| 巴林右旗| 东乌珠穆沁旗| 德兴市| 天长市| 嘉峪关市| 桑植县| 东丰县| 屯门区| 洛阳市| 昌江| 东兰县| 丰台区| 扶沟县| 威信县| 梨树县| 金山区| 永州市| 徐闻县| 岑溪市| 马龙县| 日土县|