国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

PPSM嵌入式RTOS中的窗口系統開發

發布時間:2010-8-30 15:15    發布者:techshare
關鍵詞: PPSM , RTOS , 窗口 , 嵌入式
在目前的中低檔PDA中,很多廠商都采用Motorola M68K系列芯片。Motorola為其M68K CPU提供了一套免費的實時操作系統PPSM(Personal Portable System Manager)。但該系統中沒有提供窗口系統。我們在實踐中開發了一套窗口系統,如圖1和圖2所示。該系統為事件驅動方式,并有一系列控件支持。軟件開發人員采用添加控件的方式構建所需的窗口,編寫對控件和窗口事件的響應方式。下面介紹這套窗口系統的設計方案。   




1 PPSM系統簡介

(1)虛擬多任務方式

PPSM系統中可以創建多個主任務,但只有一個主任務處于活動狀態。每個主任務可以創建多個子任務。主任務和子任務均有唯一的TaskId。任務之間可以發送消息。接收消息的任務及其主任務可以取得CPU的控制權。

(2)觸摸屏輸入

PPSM系統采用了“活動區”的概念。“活動區”是用戶設定的屏幕上的一個矩形區域,只有筆在這樣的區域中的動作才能引起PPSM向活動任務發送消息。每個活動區均屬于其創建的任務。換一種方式表達為:每個任務保存和管理一系列活動區,活動主任務的所有子任務的活動區均處于活動狀態,后創建的活動區覆蓋之前創建的活動區。

(3)圖形界面支持

PPSM系統以一部分系統內存作為屏幕緩存。每個任務可以擁有自己獨立的屏幕緩存,也可以共享一個屏幕緩存。屏幕緩存的尺寸可以與實際的屏幕大小不同。系統顯示活動任務的屏幕緩存中的圖像。每個主任務擁有自己獨立的屏幕緩存,可以使主任務切換時迅速切換屏幕;而各主任務共享一個屏幕緩存可以節約內存空間,同時,應用程序還可以創建獨立于任務的屏幕緩存。它具有與屏幕緩存同樣的結構,但不能直接輸出到屏幕上。用戶可設置當前的屏幕緩存。PPSM提供了一組GUI函數,用于在當前的屏幕緩存中作圖。

(4)事件驅動

PPSM采用中斷方式處理各類事件,如時鐘、UART輸入/輸出、筆輸入等。各種事件均向活動任務發送消息。各任務(主任務或子任務)均有各自的消息隊列。各任務從其消息隊列中取得并處理消息。

2 窗口的基本任務及界面系統的總體考慮

由于PPSM提供了靈活的屏幕緩存操作方式,開發的系統可能會因各應用程序采用了不同的屏幕緩存方式而沖突,并且難以協調。我們開發PPSM系統上的窗口系統,就是為了使其應用程序界面開發變得容易而快速,使編程人員的精力集中在應用程序本身的功能上,提高開發的效率和可靠性。

(1)關于界面繪制、切換、恢復的考慮

由于本窗口系統的目標是基于Motorola EZ/VZ328的便攜設備,其特點是內存較小、LCD屏幕較小、CPU速度和屏幕刷新速度均較慢;而窗口系統則要求刷新速度快,占有內存小。通過分析系統特點,較小的LCD屏幕上,一般很少要求子窗口之間的切換,因而本窗口系統中,子窗口不能切換。換言之,子窗口均為有模式的,只有關閉上層子窗口,才能顯示下一層的窗口。下一層的窗口被上層子窗口覆蓋的部分可以由上層子窗口保存并恢復,或由下一層的窗口自己重畫。前一種恢復方式雖然節約內存,但速度較慢,而且如果被最頂層窗口覆蓋的窗口只有一個,則每個窗口均需按順序重畫。這在速度較慢的CPU上是不能容忍的,因而我們采用了后一種保存并恢復窗口覆蓋區域的方式。

一個應用程序(主任務)擁有一個主窗口。主窗口之間的切換等同于應用程序的切換。如果以重畫的方式恢復一個主窗口,意味著該主窗口連同其所有子窗口必須依次重畫,這樣的刷新速度是不能滿足要求的。PPSM提供了這樣一種能力:如果主任務具有自己的屏幕緩存,在任務切換時,屏幕自動切換。因而我們采用這種方式。應用程序具有自己的屏幕緩存,而各窗口均在該緩存上繪出。每個應用程序均保存了一屏自己的窗口圖形,當切換時,自動恢復。

由于消息只由最頂層窗口處理,見(3)消息的處理部分,因而,在我們的窗口系統中不存在下層窗口界面繪制問題;同時,在小的屏幕上,實現窗口的移動和縮放并無太大的實用性,因而我們也不實現窗口的這些功能。

另外有一類比較特殊的窗口,即POPUP屬性的窗口。這類窗口主要應用于菜單和提示窗口,特點是:單擊窗口之外的區域將自動關閉該窗口。我們的處理方法是在這類窗口顯示時,設定一個全屏的活動區,以取得窗口外區域的筆輸入;再設定一個窗口區域的活動區覆蓋在全屏的活動區之上,以將窗口區域排除在點擊自動關閉的區域之外。

(2)關于界面輸入的考慮

由于PPSM采用活動區的輸入方式,每個任務管理自己的活動區,任務激活時,其活動區處于有效狀態。因而應用程序切換時,其活動區自動切換;但一個應用程序中,各窗口的活動區可能互相干擾。應用程序中,每個窗口均有各種的輸入區域,而各窗口的活動區域可能相互覆蓋,顯示上層窗口時必須使下次窗口的所有活動區無效。

有兩種方式可實現這樣的要求。第一種方式是,采用PPSM中子任務的方式:各子任務管理自己的活動區,當該子任務掛起或激活時,其活動區隨之掛起或激活。這要求一個窗口必須對應有一個子任務。由于每個新的子任務需要較大的系統內存空間,而我們并不需要應用程序內各窗口之間的切換,因而我們不采用這種方式。第二種方式是,采用PPSM中掛起活動區和恢復活動區的方法。PPSM支持對每個任務多次掛起活動區和恢復活動區,因而我們可以在顯示新的窗口時,先掛起原有的活動區;窗口關閉時,恢復原有的活動區。

(3)消息的處理

PPSM中定義了一系統硬件中斷產生的消息,如IRPT_TIMER、IRPT_RTC、IRPT_UART等等;同時,提供SendMessage和AdvSendMessage函數允許發送用戶自定義消息。用戶自定義消息從IRPT_USER開始。一個程序可以發送到另一個應用程序或自己。這些消息和所有系統消息均由應用程序的頂層窗口處理。應用程序從其消息隊列中取得消息后,首先,由預定義的應用程序消息處理函數處理公共的消息。然后,由為頂層窗口定義的消息處理函數處理。頂層窗口不處理的消息由預定義的窗口消息處理函數處理。

消息發送采用兩種方式。第一種是Send Message(),該函數將消息放在應用程序的消息隊列中并立即返回;第二種是直接調用應用程序頂層窗口的消息處理函數,這樣函數便在消息處理之后返回。

(4)控件體系

窗口只是提供了界面設計操作的基礎。窗口中需要一系列按功能和操作方式分類的可視的界面元素,以便編程人員能夠方便地設計窗口的界面,實現窗口的特定功能。這樣的界面元素叫控件。

由于嵌入式設備內存有限的原因,控件并不采用子窗口的方式。根據設計控件的目的,各類控件具有較為確定的外觀和規定的動作,并在特定的條件下,向其父窗口發出預定義的消息以供其處理。

控件屬于父窗口。在父窗口顯示時自動顯示,在父窗口關閉時自動釋放其占用的內存空間;父窗口接收的消息首先在各控件中分發處理。按照這一要求,窗口必須保存、維護其控件的一個列表。列表中控件的指針按控件創建的順序存放。控件按創建的順序顯示,而消息在控件中按反序傳遞,以保證后創建的控件在可以覆蓋之前創建的控件的圖形和操作。

為了提高控件開發效率,我們需要各控件可以作為一種新定義控件的子控件。這樣新定義的控件可以利用已有的控件功能。如文本框控件中可以包含水平和垂直滾動條子控件。控件可分為有焦點和無焦點的。有焦點的控件可以處理輸入法發出的字符消息。

3 窗口體系的實現

3.1 窗口的運行結構


根據以上對窗口體系的總體考慮,確定窗口的運行結構需要以下內容:

① 窗口的位置、大小和標題。

② 窗口的風格:

WS_MAINWND——應用程序主窗口。關閉主窗口將自動關閉應用程序。

WS_POPUP——彈出式窗口。單擊非窗口區域將自動關閉該窗口。該屬性不能和WS_MAINWND同時出現。

WS_NOBORDER——無邊框窗口。

WS_NOSTATEBAR——無狀態條控件的窗口。一般窗口均有一個在窗口底部的狀態條,提供彈出該窗口的命令菜單、顯示窗口標題、關閉窗口、打開選擇輸入法、顯示系統日期和時間等功能。

③ WS_POPUP類窗口的屏幕活動區和窗口活動區的ID。

④ 窗口當前的光標位置。

⑤ 窗口中控件的列表。

⑥ 窗口保存其覆蓋區域的內存指針。

⑦ 前一個窗口的指針。用以在關閉窗口時重設應用程序的頂層窗口。

⑧ 窗口的缺省輸入法類型和打開的輸入法控件的句柄。

⑨ 窗口的焦點控件的句柄。焦點控件將最先處理字符輸入的消息。

⑩ 窗口的消息處理函數指針。

3.2 窗口的創建和操作函數介紹

① HWND CreateWindow(WNDCLASS &wndCls);

WNDCLASS結構定義窗口的基本屬性,如位置、大小、標題、風格等,見上面所述。該函數為窗口運行時的結構分配內存,初始化屬性,并返回窗口結構的指針。

② BOOL ShowWindow(HWND hWnd);

顯示一個窗口。其工作包括:掛起以前的活動區;保存窗口的覆蓋區域的圖形;如果是有WS_POPUP屬性的窗口,須設定屏幕和窗口的活動區;向該窗口的消息處理函數傳遞WM_ONSHOW消息(事實上是直接調用該函數),以提供編程人員在窗口上繪制控件以外的圖形的機會;如果是沒有WS_NOSTATEBAR的窗口,添加Statebar控件;依次調用窗口中各控件的繪制函數以顯示控件;設第一個有焦點控件為窗口當前的焦點控件。

③ BOOL CloseWindow(HWND hWnd);

關閉一個窗口。其工作包括:向該窗口的事件處理函數發送WM_CLOSE消息,如果返回FALSE則退出本函數,如果返回TRUE則繼續以下工作 ——恢復窗口覆蓋區圖形;釋放POPUP類窗口的屏幕活動區和窗口活動區; 依次釋放該窗口包含的控件;隱藏光標;釋放該窗口結構占用的內存;向上層窗口發送WM_TOPWNDCLOSE的消息,該消息用于下層窗口更新需要自動變化的界面,如股票實時大盤數據表;設置該窗口的前一層窗口為應用程序的頂層窗口。

④ WNDPROC函數指針類型

typedef BOOL (*WNDEVENTHANDLE)

(HWND hWnd, U16 msgType, U32 id,P_U32 data, U32 size);

⑤ DefWndProc(HWND hWnd, U16 msgType, U32 id,P_U32 data, U32 size);

處理如POPUP窗口區外的點擊自動關閉窗口之類的消息和行為。

⑥U32 WndAddCommand(HWND hWnd, P_S8 cmdName, U16 cmdLen, P_U8 cmdIcon);

向有狀態條控件的窗口增加應
用程序定義的命令。命令出現在狀態條的彈出菜單中。該函數返回一個唯一的命令ID,用于窗口處理WM_COMMAND消息時區分命令。

⑦ BOOL WndDelCommand(HWND hWnd, HCMD cmdId);

刪除一條命令。

⑧ U32 WndSetCommand(HWND, U32 cmdId, P_S8 newCaption);

修改一條命令。

⑨ 其它函數。因篇幅原因,不能完全列出和解釋所有的窗口操作函數。

3.3 控件的實現

(1)控件的基本結構


我們使用控件的基本結構定義各類控件的公共屬性。具體的控件結構在此基礎上擴展,以包含其它屬性。以下論述控件的基本屬性。

首先,在窗口的顯示過程中,各控件的外觀由自己繪制,因而各種控件需要一個繪制函數。該函數在定義具體控件時定義,在控件結構中保留該類函數的指針。其次,各種控件需要各自的消息處理函數,該函數的指針也保存在結構中。最后,一些控件可能會動態分配內存空間以保存自身的數據。控件需要在被釋放時釋放這樣的內存,因而控件結構中也保存控件釋放函數的指針。

控件是窗口上的一個可操作區域,主要由筆輸入來操作,因而控件需要響應筆操作的活動區。各種控件的活動區數量不同,因而在控件結構中需要保存一個可增長的活動區列表;但控件的屏幕區域可能覆蓋部分窗口中的其它活動區(如其它控件),從而造成控件操作的混亂,因此需要一個控件占用區域的活動區,以屏蔽其它可能造成干擾的活動區。

由于我們需要各種控件能在定義新控件時使用,即作為新控件的子控件,在控件的結構中,須保存子控件列表。各類控件的繪圖、消息處理和釋放函數,必須為控件系統定義的相應的缺省處理函數。這些缺省處理函數根據控件的子控件列表,首先調用子控件的相應函數。

(2)具體控件定義的方法

① 一個具體的控件對應一個特定的結構。該結構首先包含控件的基本結構,其次定義該控件所需要的其它屬性。如按鍵控件,需要有按鍵的類型、顯示的文本或圖形、筆操作所需的活動區ID和按下狀態等屬性。

② 定義控件的繪制、消息處理和釋放函數。

③ 定義該控件的創建函數,如CreateButton()。在該函數的參數中包含該控件所需的初始屬性、參數中標準的部分是控件的位置和大小。該函數初始化該控件結構的屬性,包括初始化在基本控件結構中的控件繪制、消息處理和釋放函數指針,使之指向相應的函數。

④ 定義操作控件、存取控件中數據所需的其它函數。

(3)系統預定義的控件

在系統中,已經使用這種定義方式定義了一些常用的控件。它們有:

① 按鍵:Button。文本或圖形按鍵,Check方式按鍵。

② 標簽:Label。

③ 復選框:CheckBox。

④ 單選框:RadioBox。

⑤ 組合框:CombBox。

⑥ 滾動條:ScrollBar。水平或垂直,簡單類型滾動條可作為Spin使用。

⑦ 編輯框:TextBox。單行或多行,可編輯或不可編輯,有選塊功能。

⑧ 列表框:ListBox。單列或多列,選項可帶有圖標。

⑨ 狀態條:StateBar。含有命令菜單彈出按鍵、窗口關閉按鍵(在窗口關閉按鍵上顯示窗口標題)、輸入法按鍵、輸入法選擇按鍵、日期和時間顯示區。

日歷控件:Canlendar。顯示任意年月的日期,可切換公歷和農歷。組合日歷控件:Date。單行顯示日期,有彈出日歷的按鍵。電子表格:Excel。顯示數據庫的記錄,可按每列對應的字段排序。組控件:Group。用于控件分組。

3.4 菜單系統

菜單是通過在POPUP窗口中加入ListBox控件實現的。菜單窗口的消息處理函數在用戶選擇列表框項目后自動關閉,并向應用程序發送WM_ MENUCLICK消息。該消息帶有選項的序號。
本文地址:http://www.qingdxww.cn/thread-24542-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲激情 | 午夜影院入口 | 成人免费国产欧美日韩你懂的 | 日本在线播放 | 91原创视频在线 | 亚洲欧美日韩高清一区二区三区 | 欧美在线欧美 | 欧美性xxxx | 视频一区在线播放 | 亚欧激情| 欧美丝袜高跟鞋一区二区 | 一级特黄aaa大片在线观看 | 日日干狠狠操 | 亚洲欧美日韩中文综合v日本 | 一级特黄国产高清毛片97看片 | 日本高清不卡码 | 色狠狠狠色噜噜噜综合网 | 欧美日韩在线视频一区 | 四虎影院新网址 | 香蕉精品高清在线观看视频 | 天天在线精品视频在线观看 | 黄色网页在线 | 不卡视频在线观看 | 日本综合在线观看 | 日韩一区二区免费看 | 日本高清不卡中文字幕 | 欧美在线一级视频 | 日本欧美视频在线观看 | 国产区精品福利在线观看精品 | 国产成人尤物精品一区 | 日日摸狠狠的摸夜夜摸 | 日韩第六页 | 甜甜的肉禽系统小说娱乐圈 | 91色交视频 | 九九在线 | 资源在线www天堂 | 久久香蕉国产 | 免费黄网站大全 | 99热这里只有精品7 99热这里只有精品6免费 | 亚欧视频在线观看 | 在线免费观看h |