嵌入式Linux下MiniGUI的軟件開發(fā)
兩個頭文件。 編程實現(xiàn)時,MiniGUI的程序入口點是MiniGUIMain函數(shù),系統(tǒng)初始化后就會自動找到該函數(shù)。在該函數(shù)中先設(shè)置主窗口一些基本屬性,建立每個客戶程序唯一的一個消息隊列。當(dāng)程序結(jié)束時,調(diào)用MainWindow ThreadCleanup函數(shù),清除主窗口所使用的消息隊列系統(tǒng)資源,退回服務(wù)器程序中。 各個功能子函數(shù)是在MiniGUI程序的另一主體部分——主界面窗口的過程函數(shù)中調(diào)用打開的。在主窗口建立時,其中有一項屬性MainWindowProc,即是注明了對應(yīng)該窗口的過程函數(shù)。各個功能模塊的消息也都是通過主窗口中的消息循環(huán)進行觸發(fā)的。 窗口過程函數(shù)主體上都是switch和case結(jié)構(gòu)的選擇語句,針對不同的消息產(chǎn)生不同的響應(yīng)。一般MSG_CREATE消息在窗口生成時被發(fā)送,因而控件往往在這里調(diào)用CreateWindow函數(shù)生成。MSG_PAINT則是在移動窗口或調(diào)用UpdateWindow重繪時發(fā)生,可根據(jù)需要定義相應(yīng)的操作。MSG_CLOSE即是關(guān)閉窗口時的動作,一般調(diào)用DestroyMainWindow銷毀主窗口,調(diào)用PostQuitMessage退出消息循環(huán)。 此外,在窗口過程函數(shù)MiniGUI提供的GDI,即圖形設(shè)備接口(graphics device interface),可以方便地將BMP、GIF、JPEG等圖片用LoadBitmap函數(shù)輸出到界面,并通過設(shè)備上下文(DC)的邏輯 字體(logfont)實現(xiàn)多字體和多字符集支持。 廣告進程的制作也類似,不再說明。 (2)信息終端軟件服務(wù)器程序 因為服務(wù)器和客戶程序需要交換數(shù)據(jù),所以我們使用了經(jīng)MiniGUI包裝過的Socket通信機制。 在服務(wù)器中,建立一個監(jiān)聽套接字: #define LISTEN_SOCKET "/var/tmp/socket1" static int listen_fd; BOOL listen_socket(HWND hwnd) { if((listen_fd=serv_listen(LISTEN_SOCKET))<0) return FALSH; return RegisterListenFD(listen_fd,POLLIN,hwnd,NULL); } 服務(wù)器監(jiān)聽該套接字listen_fd。當(dāng)客戶有連接請求時,服務(wù)器的過程函數(shù)中就會收到MSG_FDEVENT消息,服務(wù)器就可以接受該請求以進行相應(yīng)處理: static int MainFunProc(HWND hWnd, { switch(message) {case MSG_FDEVENT: if(LOWORD(wParam)= =listen_fd){ …… conn_fd=serv_accept(listen_fd,&uid); if(conn_fd>0){ sock_read(conn_fd,buff[20>,40); …… sock_write(conn_fd,buff[20>,40); }} break; }} 在主界面進程中,需要連接到服務(wù)器時,可以通過cli_conn(LISTEN_SOCKET,‘b‘)來提出請求。 這樣,服務(wù)器和客戶程序之間即可相互交流數(shù)據(jù)了。 廣告進程實現(xiàn)時,需要在服務(wù)器中設(shè)置事件鉤子函數(shù)SetServerEventHook(my_event_hook)。因為廣告屏保是在沒有鍵盤鼠標(biāo)輸入的一段時間后自動打開的,有任意鍵時又自動關(guān)閉,所以只有始終運行在后臺的服務(wù)器才能判斷廣告是否要打開關(guān)閉。 可以在消息循環(huán)時進行判斷: while(GetMessage(&Msg,HWND_DESKTOP)) {if (pid_scrnsaver= =0&&GetTickCount()> old_tick_count+1000){ ShowCursor(FLASE); pid_scrnsaver=exec_app("./scrnsaver","crnsaver"); } DispatchMessage(&Msg); } dld_tick_count是前一次消息的時間。當(dāng)從GetTickCount()得到的當(dāng)前時間大于設(shè)定值時,還沒有任何消息的話,廣告屏保scrnsaver程序就啟動,同時隱蔽鼠標(biāo)光標(biāo)。 當(dāng)系統(tǒng)又接收到事件時,會自動執(zhí)行前面注冊過的事件鉤子函數(shù)。在該函數(shù)中,使用kill(pid_scrnsaver,SIGINT)命令關(guān)閉廣告程序,并顯示鼠標(biāo)即可。 將完成的C語言程序文件用交叉編譯工具編譯,并鏈接MiniGUI庫文件,即可生成所需的可執(zhí)行文件。 結(jié) 語 將嵌入式Linux應(yīng)用至信息家電類產(chǎn)品中,并開發(fā)出優(yōu)秀的人機交互界面,是嵌入式發(fā)展的趨勢,擁有廣闊的市場前景。本系統(tǒng)開發(fā)的嵌入式信息終端也已初見成效,相信這種方案必將得到越來越多的應(yīng)用。 |