<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于GTK+的組合構件設計

基于GTK+的組合構件設計

作者:電子科技大學(xué)自動(dòng)化工程學(xué)院 吳蓓 黃建國 丁曉琦 時(shí)間:2008-09-12 來(lái)源:今日電子 收藏

  是用戶(hù)與儀器的唯一交互方式,也是整個(gè)系統一個(gè)尤為重要的方面。即是一個(gè)應用于圖形界面開(kāi)發(fā)的良好圖形庫。在現行的儀器圖形界面開(kāi)發(fā)中不可避免地會(huì )涉及到自定義組合構件,它也是提高代碼可移植性和茁壯性的一個(gè)重要方面?;?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/嵌入式">嵌入式儀器圖形界面的需要,筆者在本文中著(zhù)重介紹了自定義組合構件的設計方法。并通介紹任意中波形顯示組合構件來(lái)為讀者提供一個(gè)可參考的實(shí)例。

本文引用地址:http://dyxdggzs.com/article/87996.htm

  概述

  1 簡(jiǎn)介

  GTK+(GIMP ToolKit,GIMP工具包)最初用于開(kāi)發(fā)GIMP,是一個(gè)用于創(chuàng )建圖形用戶(hù)接口的圖形庫。在功能上類(lèi)似微軟的MFC,即為應用程序提供一套與平臺無(wú)關(guān)的接口。GTK+是基于LGPL授權的,因此GTK+在開(kāi)發(fā)開(kāi)源軟件或商業(yè)的非自由軟件領(lǐng)域中都得到越來(lái)越廣泛的使用。特別在嵌入式應用中,由于GTK+庫小,且程序員可以根據自己需要對其進(jìn)行裁剪,因此其占用資源少并能快速裝入,所以基于GTK+開(kāi)發(fā)的適合在內存受限的嵌入式設備上運行。

  2 GTK+的庫的調用關(guān)系

  GTK+建立在GDK (GIMP Drawing Kit)的上層,基本上是將Xlib功能包裝起來(lái)。它被稱(chēng)為GIMP toolkit是因為原來(lái)是寫(xiě)來(lái)開(kāi)發(fā)GIMP,但現在被許多免費軟體計劃所使用。GTK基本上是物件導向應用軟體程式設計界面(API)。雖然完全用C所寫(xiě)成,他是用classes及callback函數的觀(guān)念所做出來(lái)的。還有另一個(gè)被稱(chēng)為glib的函數庫被用到,該函數庫包涵了一些標準X函數的替代函數及一些額外的處理鏈結表的函數,等等。這些替代函數是用來(lái)增加GTK的可移植性的,因為有些函數需要用到非標準的功能,諸如g_strerror()。有些則包含一些libc版本的加強的功能,諸如g_malloc有加強的除錯功能。

  GTK+是在Ddk的基礎上創(chuàng )建的,其軟件層次結構如圖1所示。Glib是Linux系統下最常用的輕量級的C語(yǔ)言函數庫,它提供了C常用的數據結構定義、處理函數、宏、可移植的封裝和一些運行機能。Xlib是用來(lái)控制顯示的底層圖形函數庫。Gdk則是對Xlib的封裝。

  圖1即為GTK+軟件結構層次圖。

  組合構件的定義及其設計難點(diǎn)分析

  1 組合構件的定義


圖1 GTK+軟件結構層次圖

  在GTK+圖形庫中,我們將窗口、按鈕、框架、樹(shù)等圖形界面元素稱(chēng)為構件。構件具有面向對象的特征,其具體結構由GTK+庫所定義,這對使用構件的程序員來(lái)說(shuō)是透明的。GTK+庫提供了一套完善的構件,供程序員創(chuàng )建出豐富的圖形界面。同時(shí),程序員也可方便的創(chuàng )建自定義構件。

  組合構件是構件的一種,它將多個(gè)構件組合起來(lái)成為一個(gè)新的構件,它不是單純的將多個(gè)構件組合,也不是單純的從某個(gè)控件繼承下來(lái)的子控件,它有每個(gè)成員構件所沒(méi)有的新功能。它是為了配合設計的需要,將每個(gè)成員構件組合起來(lái)形成一個(gè)具有新功能,新接口,實(shí)現新功能的構件。但是嚴格意義上講它不能稱(chēng)之為全新的構件。

  2 組合構件的設計難點(diǎn)分析

  自定義組合構件的設計首先需要對GTK+自定義構件的設計非常熟悉,對GTK+構件的設計風(fēng)格和繼承關(guān)系很了解,并且能掌握對各個(gè)庫的相應關(guān)系。組合構件它不是單純從某個(gè)構件繼承下來(lái)的,只是組合任何想要組合的構件來(lái)實(shí)現某項功能。因此必須考慮該組合構件的父類(lèi)問(wèn)題。

  組合構件也跟構件庫里面的構件一樣,它也可能要接收信號并做出相應的處理。因此掛接信號也是設計需要考慮的問(wèn)題。

  作為一個(gè)構件,組合構件也應有自己的風(fēng)格,由于組合構件是多個(gè)構件的組合,每個(gè)構件又有其不同的風(fēng)格,如何確定當前構件的風(fēng)格也是設計的難點(diǎn)。

  組合構件的設計思想及其實(shí)現

  1 組合構件的設計思想

  通俗的講,GTK+的構件庫是基于C語(yǔ)言的,它不具有面向對象的特性,然而GTK+的確又是面向對象的,那是因為它用C語(yǔ)言來(lái)實(shí)現了C++編譯器的功能。因此它同樣具有繼承的特性,它的代碼風(fēng)格也延續了面向對象的設計風(fēng)格。在GTK+庫中,直接繼承自GtkObject對象的構件主要是GtkWidget,它幾乎是所有可視構件的共同祖先,大多數構件共有的屬性都包括在其中。與其他GUI開(kāi)發(fā)工具不同的是,我們不用直接創(chuàng )建GtkObject或GtkWidget對象,而是用定義對象的實(shí)例結構和類(lèi)結構的方式來(lái)定義對象,然后再通過(guò)類(lèi)型注冊來(lái)實(shí)現對象。當前筆者就根據組合構件的特點(diǎn),直接從GtkObject繼承。它與GtkWidget是一種并行關(guān)系。和其他構件一樣,它也有相應的宏定義,來(lái)進(jìn)行各種強制轉換和類(lèi)型獲取。

  任何一個(gè)構件都有其創(chuàng )建對象函數,組合構件也是一樣,在對象中定義各個(gè)成員構件,在創(chuàng )建對象時(shí)將其一一創(chuàng )建,并根據需要對其各個(gè)構件來(lái)進(jìn)行屬性設定,最后返回的是組合構件對象本身。關(guān)于信號的設定也是和其他構件的方法一樣,在類(lèi)的結構體中定義信號,并在類(lèi)的初始化中對信號進(jìn)行定義。

  組合構件的接口設計應可以根據當前總體設計的需要,而不是像一般構件一樣完全的獨立出來(lái),它具有自己的特色,并不需要刻意遵守一般構件的要求。這也是組合構件的靈活性所在。

  GTK+允許用戶(hù)通過(guò)rc文件來(lái)定制應用程序的主題風(fēng)格,即設置構件顏色、字號大小,并為構件添加背景圖標等。而對于組合構件而言,由于其為多個(gè)構件的組合,每個(gè)構件都有其相應的風(fēng)格設計,因此嚴格的講它本身是不具有風(fēng)格設計的,所謂組合構件的風(fēng)格設計,就是對各個(gè)構件進(jìn)行風(fēng)格設計,并將其風(fēng)格設定封裝在一個(gè)函數里,對外只提供一個(gè)接口。對于組合構件,如果不進(jìn)行風(fēng)格設計,它將沿用整個(gè)圖形界面的風(fēng)格設計。

  2自定義組合構件在任意圖形界面中的實(shí)現

  筆者參與開(kāi)發(fā)的任意以linux作為操作系統平臺,以320×240的彩色液晶為顯示器,以精簡(jiǎn)版的X Windows作為圖形用戶(hù)界面系統,以GTK+庫為圖形編程庫。下面就是筆者設計的任意波形發(fā)生器的整個(gè)圖形界面,在圖形界面中可以看到下面有波形顯示和坐標值顯示。筆者利用組合構件的設計思想來(lái)設計該圖形界面的波形顯示部分,通常情況下組合構件的設計是要符合當前總體設計的某項要求,因此組合構件有可能只是為了實(shí)現某項實(shí)際的功能而具體設計的一個(gè)構件。在任意波形發(fā)生器的設計中,筆者將下面的波形顯示部分設計為一個(gè)組合構件,簡(jiǎn)單地稱(chēng)之為awgwavegraph,若將其命名為gtkwavegraph是不合理的,因為它僅僅是為了實(shí)現任意波形發(fā)生器的圖形界面而設計的一種多構件組合,而不是一個(gè)嚴格意義上的全新構件。在設計awgwavegraph時(shí)考慮到構件本身只是對某個(gè)信號進(jìn)行響應,而不需要對信號進(jìn)行獲取,因此該組合構件并沒(méi)有設計獲取信號。所謂的響應,只是需要對坐標進(jìn)行更新,根據此項需求,筆者提供了一個(gè)更新坐標的函數,接口僅僅是組合構件本身。圖2即為任意波形發(fā)生器圖形界面。


圖2 任意波形發(fā)生器圖形界面

  結束語(yǔ)

  基于GTK+的組合構件設計,效率高,占用資源少,可增強程序的茁壯性,在嵌入式系統的圖形界面編程領(lǐng)域有著(zhù)良好的發(fā)展前景。目前,此項組合構件已經(jīng)應用到500MPS任意波形發(fā)生器中。它使用方便,穩定性好,為開(kāi)發(fā)人員提供了良好范例。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>