<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > GTK+的組合構(gòu)件設(shè)計(jì)

          GTK+的組合構(gòu)件設(shè)計(jì)

          作者: 時(shí)間:2008-09-18 來源:網(wǎng)絡(luò) 收藏
            圖形用戶界面是用戶與儀器的唯一交互方式,也是整個(gè)嵌入式系統(tǒng)一個(gè)尤為重要的方面。GTK+即是一個(gè)應(yīng)用于嵌入式圖形界面開發(fā)的良好圖形庫。在現(xiàn)行的儀器圖形界面開發(fā)中不可避免地會(huì)涉及到自定義,它也是提高代碼可移植性和茁壯性的一個(gè)重要方面?;谇度胧絻x器圖形界面的需要,筆者在本文中著重介紹了自定義的設(shè)計(jì)方法。并通介紹任意波形發(fā)生器中波形顯示來為讀者提供一個(gè)可參考的實(shí)例。

            GTK+概述

            1 GTK+簡(jiǎn)介

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

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

            GTK+建立在GDK (GIMP Drawing Kit)的上層,基本上是將Xlib功能包裝起來。它被稱為GIMP toolkit是因?yàn)樵瓉硎菍憗黹_發(fā)GIMP,但現(xiàn)在被許多免費(fèi)軟體計(jì)劃所使用。GTK基本上是物件導(dǎo)向應(yīng)用軟體程式設(shè)計(jì)界面(API)。雖然完全用C所寫成,他是用classes及callback函數(shù)的觀念所做出來的。還有另一個(gè)被稱為glib的函數(shù)庫被用到,該函數(shù)庫包涵了一些標(biāo)準(zhǔn)X函數(shù)的替代函數(shù)及一些額外的處理鏈結(jié)表的函數(shù),等等。這些替代函數(shù)是用來增加GTK的可移植性的,因?yàn)橛行┖瘮?shù)需要用到非標(biāo)準(zhǔn)的功能,諸如g_strerror()。有些則包含一些libc版本的加強(qiáng)的功能,諸如g_malloc有加強(qiáng)的除錯(cuò)功能。

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

            圖1即為GTK+軟件結(jié)構(gòu)層次圖。

            組合構(gòu)件的定義及其設(shè)計(jì)難點(diǎn)分析

            1 組合構(gòu)件的定義

          本文引用地址:http://www.ex-cimer.com/article/259249.htm

          圖1 GTK+軟件結(jié)構(gòu)層次圖

            在GTK+圖形庫中,我們將窗口、按鈕、框架、樹等圖形界面元素稱為構(gòu)件。構(gòu)件具有面向?qū)ο蟮奶卣鳎渚唧w結(jié)構(gòu)由GTK+庫所定義,這對(duì)使用構(gòu)件的程序員來說是透明的。GTK+庫提供了一套完善的構(gòu)件,供程序員創(chuàng)建出豐富的圖形界面。同時(shí),程序員也可方便的創(chuàng)建自定義構(gòu)件。

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

            2 組合構(gòu)件的設(shè)計(jì)難點(diǎn)分析

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

            組合構(gòu)件也跟構(gòu)件庫里面的構(gòu)件一樣,它也可能要接收信號(hào)并做出相應(yīng)的處理。因此掛接信號(hào)也是設(shè)計(jì)需要考慮的問題。
            作為一個(gè)構(gòu)件,組合構(gòu)件也應(yīng)有自己的風(fēng)格,由于組合構(gòu)件是多個(gè)構(gòu)件的組合,每個(gè)構(gòu)件又有其不同的風(fēng)格,如何確定當(dāng)前構(gòu)件的風(fēng)格也是設(shè)計(jì)的難點(diǎn)。

            組合構(gòu)件的設(shè)計(jì)思想及其實(shí)現(xiàn)

            1 組合構(gòu)件的設(shè)計(jì)思想

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

            任何一個(gè)構(gòu)件都有其創(chuàng)建對(duì)象函數(shù),組合構(gòu)件也是一樣,在對(duì)象中定義各個(gè)成員構(gòu)件,在創(chuàng)建對(duì)象時(shí)將其一一創(chuàng)建,并根據(jù)需要對(duì)其各個(gè)構(gòu)件來進(jìn)行屬性設(shè)定,最后返回的是組合構(gòu)件對(duì)象本身。關(guān)于信號(hào)的設(shè)定也是和其他構(gòu)件的方法一樣,在類的結(jié)構(gòu)體中定義信號(hào),并在類的初始化中對(duì)信號(hào)進(jìn)行定義。
          組合構(gòu)件的接口設(shè)計(jì)應(yīng)可以根據(jù)當(dāng)前總體設(shè)計(jì)的需要,而不是像一般構(gòu)件一樣完全的獨(dú)立出來,它具有自己的特色,并不需要刻意遵守一般構(gòu)件的要求。這也是組合構(gòu)件的靈活性所在。

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

            2自定義組合構(gòu)件在任意波形發(fā)生器圖形界面中的實(shí)現(xiàn)

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

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

            結(jié)束語

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



          關(guān)鍵詞: GTK+ 組合 構(gòu)件

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();