<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jinfeng_wang

    G-G-S,D-D-U!

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks

    http://www.ibm.com/developerworks/cn/linux/guitoolkit/newt/index.html




    NEWT是在Linux下一個(gè)基于文本方式的窗口開發(fā)工具,最初是為Red Hat Linux的安裝程序而設(shè)計(jì)的。本文將告訴您怎樣一步步使用NEWT為自己的應(yīng)用程序加上文本方式下的窗口界面。

    NEWT簡(jiǎn)介

    考慮到Red Hat Linux有軟盤安裝這一安裝方式,安裝代碼運(yùn)行于有限的資源環(huán)境中,特別是在有限的文件空間中。NEWT的大小一開始就成為一個(gè)重要的問(wèn)題。為了最小化它所占的空間,NEWT的設(shè)計(jì)思想有下面幾點(diǎn):

    1. NEWT由C語(yǔ)言寫成,而不是C++
    2. NEWT所有窗口的生成都是基于堆棧的數(shù)據(jù)結(jié)構(gòu),窗口的外觀都是統(tǒng)一的模板,不由程序員修改
    3. 輸入設(shè)備只支持終端鍵盤
    NEWT 提供C語(yǔ)言的應(yīng)用程序接口(API),它不直接進(jìn)行低級(jí)屏幕操作,是在S-Lang 庫(kù)上實(shí)現(xiàn)的。

     

    組件(Components)

    在NEWT中,每一個(gè)可顯示的項(xiàng)目稱為組件。組件主要有兩類:Form組件與非Form組件。非Form組件是除Form以外的所有組件。Form邏輯地組織各個(gè)組件成為一個(gè)功能集。Form是一個(gè)容器組件,讓其他組件都裝在其上,有點(diǎn)類似gtk中的垂直盒(Vbox)和水平盒(Hbox)。當(dāng)一個(gè)應(yīng)用準(zhǔn)備從用戶中獲得輸入,就要run一個(gè)Form,這也類似于gtk中的gtk_widget_show()。Form組件可以包含其他任何組件,也包含其他的Form作為子Form。

    每一個(gè)組件都是由一個(gè)屬于newtComponent數(shù)據(jù)類型的變量唯一標(biāo)志,這一變量必須由生成該組件的函數(shù)建立,而不能由程序員自己建立。屬于newtComponent數(shù)據(jù)類型的變量其實(shí)只是一個(gè)指針。

    NEWT程序的開始與結(jié)束

    有三個(gè)函數(shù)是每個(gè)NEWT程序都必須用到的,頭兩個(gè)用于初始化系統(tǒng)。

    int newtInit(void);
                void newtCls(void);

    newtInit()必須是每個(gè)NEWT程序第一個(gè)調(diào)用的函數(shù),用于初始化數(shù)據(jù)結(jié)構(gòu)和重置終端于raw模式。大多數(shù)應(yīng)用在newtInit()后立即調(diào)用newtCls(),newtCls()用于清除屏幕,這個(gè)函數(shù)不是必須的,但有助于優(yōu)化屏幕。

    當(dāng)一個(gè)NEWT程序準(zhǔn)備結(jié)束時(shí),就要調(diào)用以下函數(shù)。
    int newtFinished(void);

    newtFinished()恢復(fù)終端在調(diào)用newtInit()前的狀態(tài),重置原來(lái)的輸入狀態(tài)。若沒(méi)調(diào)用這函數(shù),終端需重啟才能回到命令行狀態(tài)。

    編譯NEWT程序

    在Linux上用gcc編譯時(shí)帶 -lnewt 參數(shù)。以下所說(shuō)的函數(shù)都可在/usr/include/newt.h(Red Hat Linux 7.1)中找到。

    標(biāo)志

    NEWT定義了若干個(gè)標(biāo)志(FLAG),這里僅介紹常用的幾個(gè)。

    • NEWT_FLAG_RETURNEXIT?D?D當(dāng)在組件上按回車時(shí)程序退出
    • NEWT_FLAG_HIDDEN?D?D輸入不回顯,大多數(shù)應(yīng)用在輸入密碼的情況
    • NEWT_ENTRY_SCROLL?D?D允許滾動(dòng)輸入
    • NEWT_FLAG_WRAP?D?D換行時(shí)整個(gè)單詞換行
    • NEWT_FLAG_BORDER?D?D加邊框
    • NEWT_FLAG_MULTIPLE?D?D允許多選

    若要使用多個(gè)標(biāo)志,可對(duì)多個(gè)標(biāo)志進(jìn)行與操作('|')。

    根窗口(root window)

    終端所顯示的背景,只有不被任何窗口遮蓋的部分稱為根窗口。一般地,應(yīng)用不需使用到根窗口,而把文字寫到屬于自己的窗口上。所有組件都不應(yīng)放在根窗口上。根窗口只用于顯示一些輔助信息,例如程序的作者姓名、版本等。NEWT提供兩種在根窗口顯示文字的方式,它們是唯一能越出組件自己當(dāng)前窗口寫文字的NEWT函數(shù)。

    void newtDrawRootText(int left, int top, const char *
                text);

    該函數(shù)用于在根窗口指定位置寫出text字苻串,left和top為字苻串text的開始處,left是屏幕x坐標(biāo),top是屏幕y坐標(biāo)。

    Left和top允許為負(fù)數(shù)。屏幕坐標(biāo)原點(diǎn)在顯示器的左上角,x坐標(biāo)從原點(diǎn)出發(fā)至左向右增大,y坐標(biāo)從原點(diǎn)出發(fā)至上向下增大。點(diǎn)(10,5)表示以左上角為原點(diǎn)x=10,y=5,而left,top為負(fù),表與為正數(shù)方向相對(duì)。點(diǎn)(-10,5)表以右上角為原點(diǎn)x=10,因此點(diǎn)(10,5)與點(diǎn)(-10,5)在屏幕左右兩邊相對(duì),同理點(diǎn)(10,5)與點(diǎn)(10,-5)在屏幕上下兩邊相對(duì)。

    在文本方式下,通常屏幕的最后一行用于顯示幫助信息,如每個(gè)快捷鍵所對(duì)應(yīng)的功能等。這一提示行稱為幫助行(help line)。正如前面所述,NEWT是基于堆棧,壓棧Push操作顯示幫助行,出棧Pop操作刪除幫助行。基于棧的操作后面還回遇到。

    void newtPushHelpLine(const char * text);
                void newtPopHelpLine(void);

    newtPushHelpLine()用于顯示幫助行,text為所要顯示的字苻串指針,若為NULL則顯示缺省的幫助行。NewtPopHelpLine()則刪除幫助行。

    非正常退出 

    在缺省情況下,NEWT程序不能非正常退出,盡管大多數(shù)Unix程序可以通過(guò)按Ctrl-z強(qiáng)迫退出,但在NEWT不支持此功能。因NEWT初始化時(shí)屏蔽所有終端信號(hào)。

    typedef void (*newtSuspendCallback)(void);
                void newtSetSuspendCallback(newtSuspendCallback cb);

    但可通過(guò)調(diào)用newtSetSuspendCallback()實(shí)現(xiàn)Ctrl-z強(qiáng)迫退出的功能,cb是相應(yīng)的回調(diào)函數(shù),它不帶參數(shù),只做清理工作,如newtFinished()等。早期Red Hat Linux的安裝程序當(dāng)運(yùn)行到硬盤分區(qū)時(shí),若你使用Fdisk則屏幕回到命令行狀態(tài)運(yùn)行Fdisk進(jìn)行分區(qū),退出Fdisk時(shí)又回到當(dāng)前窗口。要實(shí)現(xiàn)這種功能,在回調(diào)函數(shù)中加入下面兩個(gè)函數(shù):
    void newtSuspend(void);
                void newtResume(void);

    newtSuspend()告訴NEWT程序回到終端初始化前的狀態(tài),做需要做的工作。如需要回到NEWT界面,調(diào)用newtResume()恢復(fù)。

    窗口

    生成窗口有兩種主要方式:
    int newtCenteredWindow(int width, int height, const char * title);
                int newtOpenWindow(int left, int top, int width, int height, const char * title);

    由名字可知,newtCenteredWindow()在屏幕中心生成窗口,width為窗口寬度,height為窗口高度,title為窗口標(biāo)題字串指針,標(biāo)題文字為紅色。由newtOpenWindow()生成的窗口位置由left,top確定,其余參數(shù)同上。

    所有窗口的刪除都是用同一種方式,由于NEWT是基于堆棧來(lái)操作,只有在棧頂?shù)拇翱诓拍鼙粍h除,位于棧頂?shù)拇翱诩串?dāng)前你能看到的不被任何其他窗口遮蓋的窗口。

    void newtPopWindow(void);

    這函數(shù)刪除屏幕最頂層的窗口,并重畫被該窗口遮蓋的部分。

    Form

    正如前述那樣,F(xiàn)orm是一個(gè)容器組件,同一時(shí)間只能生成一個(gè)Form,所有組件都必須放在Form上,然后運(yùn)行它。生成一個(gè)Form用以下函數(shù):
    newtComponent newtForm(newtComponent vertBar, const char * help, int flags);

    vertBar是垂直滾動(dòng)條,help是提示信息,通常這兩個(gè)參數(shù)都不會(huì)用到,用NULL即可,flags就是前述的標(biāo)志。該函數(shù)返回標(biāo)志所生成的Form的變量。

    把組件放在Form上用以下函數(shù):
    void newtFormAddComponent(newtComponent form, newtComponent co);
                void newtFormAddComponents(newtComponent form, ...);

    newtFormAddComponent()只放一個(gè)組件在Form上,而newtFormAddComponents()則可放多個(gè)組件,最后用NULL結(jié)束。

    然后就運(yùn)行它:
    newtComponent newtRunForm(newtComponent form);

    其中Form參數(shù)是newtForm()返回的變量。

    刪除一個(gè)Form:
    void newtFormDestroy(newtComponent form);

    當(dāng)一個(gè)Form被刪除時(shí),其上的組件一同被刪除,并釋放內(nèi)存資源。

    按鈕

    幾乎所有的Form都包含最小一個(gè)按鈕。按鈕分兩類:完全按鈕(full button)和緊縮按鈕(compact button)。完全按鈕富有立體感,緊縮按鈕則單調(diào)些。

    newtComponent newtButton(int left, int top, const char * text);
                newtComponent newtCompactButton(int left, int top, const char * text);

    newtButton()生成完全按鈕,letf,top指定該按鈕位置,text是指向按鈕文字的指針,該函數(shù)返回按鈕的newtComponent變量。NewtCompactButton()生成緊縮按鈕,參數(shù)及返回值同上。

    標(biāo)簽

    標(biāo)簽是NEWT程序最簡(jiǎn)單的組件,用于顯示給定的文本但不允許用戶輸入。

    newtComponent newtLabel(int left, int top, const char * text);
                void newtLabelSetText(newtComponent co, const char * text);

    newtLabel()生成標(biāo)簽組件,并返回它的newtComponent變量,參數(shù)left,top指定標(biāo)簽組件位置,text為給定的文本。NewtLabelSetText()用于動(dòng)態(tài)改變標(biāo)簽組件的文字,co是要改變的標(biāo)簽組件,test是要改變的字串指針。

    輸入盒(Entry Box)

    輸入盒可讓用戶輸入字符串到Form中然后由應(yīng)用接收。

    newtComponent newtEntry(int left, int top, const char * initialValue, int width,char ** resultPtr, int flags);
                void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd);
                char * newtEntryGetValue(newtComponent co);

    newtEntry()生成輸入盒組件,其中initialValue為初始化字符串指針,若不需則用NULL,width為寬度,resultPtr為指向當(dāng)前輸入的字符,flags為標(biāo)志。Flags設(shè)為NEWT_ENTRY_SCROLL,當(dāng)輸入的字串長(zhǎng)度等于輸入盒的寬度時(shí)輸入盒將往后滾動(dòng),否則不能再輸入;Flags設(shè)為NEWT_FLAG_HIDDEN 輸入不回顯,主要應(yīng)用于輸入密碼方面。NewtEntrySet()用于動(dòng)態(tài)地改變輸入盒的內(nèi)容,value為字符串指針,cursorAtEnd實(shí)質(zhì)是一個(gè)邏輯變量,由于C語(yǔ)言沒(méi)有邏輯類型變量,僅用int代替,若為0則表TRUE,指定光標(biāo)跟隨,非0光標(biāo)不跟隨輸入。NewtEntryGetValue()返回輸入的字串。

    檢查盒(Checkbox)

    檢查盒可對(duì)其代表的內(nèi)容通過(guò)按空格鍵切換預(yù)定的各種狀態(tài)。

    newtComponent newtCheckbox(int left, int top, const char * text, char defValue,const char * seq, char * result);
                char newtCheckboxGetValue(newtComponent co);

    newtCheckbox()生成一個(gè)檢查盒,text標(biāo)明它所代表的內(nèi)容,defValue為缺省值也即初始值,seq為切換的順序,result指向當(dāng)前狀態(tài)。如defValue='@',seq="@*X",則初始時(shí)為[@],當(dāng)按空格鍵==》[*]再按空格鍵==》[X],如此循環(huán)。若result為NULL則需 NewtCheckboxGetValue()獲取當(dāng)前狀態(tài)。

    單選按鈕(Radio Button)

    單選按鈕的外觀與檢查盒非常相似。不同的是單選按鈕是由若干個(gè)組成一個(gè)集合,當(dāng)一個(gè)單選按鈕被選中時(shí),其他單選按鈕則被清除。若集合中只有一個(gè)單選按鈕,它總會(huì)被選中,因而就失去了選擇的意義。

    newtComponent newtRadiobutton(int left, int top, const char * text, int isDefault, newtComponent prevButton);
                newtComponent newtRadioGetCurrent(newtComponent setMember);

    newtRadiobutton()建立單選按鈕集合,text為代表單選按鈕的字符串指針,isDefault是邏輯開關(guān),為1表邏輯TRUE,初始狀態(tài)為選中;為0表FALSE,初始狀態(tài)為不選中。若當(dāng)前單選按鈕是集合中的第一個(gè),prevButton為NULL讓newtRadiobutton()自動(dòng)建立一個(gè)集合;若不是第一個(gè),prevButton為前一個(gè)由newtRadiobutton()生成的單選按鈕。

    范圍(Scale)

    范圍組件通常用于制作水平進(jìn)度條。

    newtComponent newtScale(int left, int top, int width, long long fullValue);
                void newtScaleSet(newtComponent co, unsigned long long amount);

    newtScale()生成水平進(jìn)度條,width為寬度,fullValue為進(jìn)度條的最大值。NewtScaleSet()用于設(shè)置進(jìn)度條的值。

    文本盒(Textbox)

    文本盒能讓終端顯示一個(gè)文本塊。

    newtComponent newtTextbox(int left, int top, int width, int height, int flags);
                void newtTextboxSetText(newtComponent co, const char * text);

    newtTextbox()建立一個(gè)文本盒,其中flags可設(shè)為NEWT_FLAG_WRAP、NEWT_FLAG_SCROLL和它們的與操作。文本盒建立后,由newtTextbox()填充文本。

    滾動(dòng)條(Scrollbar)

    newtComponent newtVerticalScrollbar(int left, int top, int height,int normalColorset, int thumbColorset);

    newtVerticalScrollbar()生成滾動(dòng)條,normalColorset為滾動(dòng)條顏色,thumbColorset為滾動(dòng)塊顏色。

    列表盒(Listboxe)

    列表和是NEWT中最重要的組件,允許多選或單選

    newtComponent newtListbox(int left, int top, int height, int flags);
                int newtListboxAppendEntry(newtComponent co, const char * text, const void * data);
                void * newtListboxGetCurrent(newtComponent co);
                void newtListboxSetWidth(newtComponent co, int width);
                void newtListboxSetCurrent(newtComponent co, int num);
                void newtListboxSetCurrentByKey(newtComponent co, void * key);

    newtListbox()生產(chǎn)列表盒,flags可設(shè)為NEWT_FLAG_SCROLL、NEWT_FLAG_RETURNEXIT、NEWT_FLAG_BORDER、 NEWT_FLAG_MULTIPLE和它們的與操作。NewtListboxAppendEntry()用于在當(dāng)前列表盒最后追加一個(gè)列表項(xiàng),每一個(gè)個(gè)列表項(xiàng)由key唯一標(biāo)志,key可為任意類型,只要能和其他列表項(xiàng)區(qū)別開來(lái)就可以了。data為key數(shù)據(jù)。操作列表盒的函數(shù)還有:

    void newtListboxSetEntry(newtComponent co, void * key, const char * text);
                int newtListboxInsertEntry(newtComponent co, const char * text, const void * data, void * key);
                int newtListboxDeleteEntry(newtComponent co, void * key);
                void newtListboxClear(newtComponent co);





    回頁(yè)首


    例子:

    #include <newt.h>
                #include <stdio.h>
                void rootwin_show()
                {
                newtCls();
                /*請(qǐng)觀察left,top為正數(shù),為負(fù)數(shù)地情形*/
                newtDrawRootText(0, 0, "左上角");
                newtDrawRootText(-6, 0, "右上角");
                newtDrawRootText(0, -3, "左下角");
                newtDrawRootText(-6, -3, "右下角");
                /*注意helpline缺省時(shí)的內(nèi)容*/
                newtPushHelpLine(NULL);
                newtRefresh();
                sleep(10);
                newtPushHelpLine("我的幫助行");
                newtRefresh();
                sleep(3);
                newtPopHelpLine();
                newtRefresh();
                sleep(1);
                }
                void label_button()
                {
                newtComponent form, label, entry, button,cb;
                char * entryValue;
                newtCls();
                newtCenteredWindow(50,10,"輸入與標(biāo)簽演示");
                /*left,top是相對(duì)于中心窗口而言*/
                label = newtLabel(10, 1, "請(qǐng)輸入:");
                entry = newtEntry(19, 1, NULL, 20, &entryValue,
                NEWT_FLAG_SCROLL);
                newtEntrySet(entry,"\0",0);
                button = newtButton(10, 5, "完全按鈕");
                cb=newtCompactButton(25,5,"緊縮按鈕");
                form = newtForm(NULL,NULL, 0);
                newtFormAddComponents(form, label, entry, button,cb, NULL);
                newtRunForm(form);
                if(*entryValue!='\0')
                {
                newtDrawRootText(0,0,"你輸入了:");
                newtDrawRootText(12,0,entryValue);
                }
                else
                newtDrawRootText(0,0,"無(wú)輸入!");
                newtRefresh();
                newtFormDestroy(form);
                sleep(5);
                }
                void check_radio()
                {
                newtComponent form, checkbox, rb[3], button,lable1,lable2;
                char cbValue,cv[2];
                int i;
                newtCls();
                newtOpenWindow(10, 8, 40, 11, "檢查盒與單選盒演示");
                lable1 = newtLabel(2, 1, "檢查盒:");
                checkbox = newtCheckbox(10, 1, "A checkbox", ' ', " *X", &cbValue);
                lable2 = newtLabel(2, 4, "單選盒:");
                rb[0] = newtRadiobutton(10, 3, "Choice 1", 1, NULL);
                rb[1] = newtRadiobutton(10, 4, "Choice 2", 0, rb[0]);
                rb[2] = newtRadiobutton(10, 5, "Choice 3", 0, rb[1]);
                button = newtButton(15, 7, "退出");
                form = newtForm(NULL, NULL, 0);
                newtFormAddComponent(form, checkbox);
                newtFormAddComponent(form, lable1);
                newtFormAddComponent(form, lable2);
                for (i = 0; i < 3; i++)
                newtFormAddComponent(form, rb[i]);
                newtFormAddComponent(form, button);
                newtPushHelpLine("<空格健>選擇");
                newtRefresh();
                newtRunForm(form);
                for (i = 0; i < 3; i++)
                if (newtRadioGetCurrent(rb[0]) == rb[i])
                {       newtDrawRootText(0, 0, "單選盒:");
                newtDrawRootText(9, 0, "第");
                if(i==0)newtDrawRootText(11, 0,"1");
                if(i==1)newtDrawRootText(11, 0,"2");
                if(i==2)newtDrawRootText(11, 0,"3");
                newtDrawRootText(12, 0, "個(gè)");
                }
                newtDrawRootText(0, 3, "檢查盒狀態(tài):");
                cv[0]=cbValue;cv[1]='\0';
                newtDrawRootText(13, 3, cv);
                newtRefresh();
                newtFormDestroy(form);
                sleep(5);
                }
                void test()
                {
                char message[] = "This is a pretty long message. It will be displayed "
                "in a newt textbox, and illustrates how to construct "
                "a textbox from arbitrary text which may not have "
                "very good line breaks.\n\n"
                "Notice how literal \\n characters are respected, and "
                "may be used to force line breaks and blank lines.";
                newtComponent form, text, button;
                newtCls();
                text = newtTextboxReflowed(1, 1, message, 30, 5, 5, 0);
                button = newtButton(12, newtTextboxGetNumLines(text) + 2, "退出");
                newtOpenWindow(10, 5, 37,
                newtTextboxGetNumLines(text) + 7, "文本盒");
                form = newtForm(NULL, NULL, 0);
                newtFormAddComponents(form, text, button, NULL);
                newtRunForm(form);
                newtFormDestroy(form);
                }
                main()
                {
                newtComponent ls,fm;
                int p = 1, q = 2, r = 3, s = 4, t = 5, *u;
                newtInit();
                do {
                newtCls();
                newtRefresh();
                newtDrawRootText(0,0,"這是我的一個(gè)NEWT演示程序");
                newtCenteredWindow(50,10,"請(qǐng)選擇");
                ls = newtListbox(18,3,5,NEWT_FLAG_RETURNEXIT);
                newtListboxAppendEntry(ls,"根窗口演示",&p);
                newtListboxAppendEntry(ls,"輸入盒與按鈕",&q);
                newtListboxAppendEntry(ls,"檢查盒與單選盒",&r);
                newtListboxAppendEntry(ls,"文本盒",&s);
                newtListboxAppendEntry(ls,"退出 ",&t);
                newtPushHelpLine("                Move using the arrow keys and press ENTER to select");
                fm = newtForm(NULL,NULL,0);
                newtFormAddComponents(fm,ls,NULL);
                newtRunForm(fm);
                u = newtListboxGetCurrent(ls);
                newtPopWindow();
                newtFormDestroy(fm);
                switch(*u) {
                case 1:
                rootwin_show();
                break;
                case 2:
                label_button();
                break;
                case 3:
                check_radio();
                break;
                case 4:
                test();
                break;
                case 5:
                newtFinished();
                exit(0);
                }
                } while(1);
                }
                

    運(yùn)行結(jié)果如下圖:



     
    posted on 2007-07-20 14:02 jinfeng_wang 閱讀(621) 評(píng)論(0)  編輯  收藏 所屬分類: ZZLinux
    主站蜘蛛池模板: 亚洲精品中文字幕乱码三区| 亚洲AV无码片一区二区三区| 亚洲精品成人片在线观看精品字幕| 91九色精品国产免费| 99爱在线精品视频免费观看9| 国产亚洲精品仙踪林在线播放| 亚洲人成在线电影| 久久久久亚洲精品影视| 国产男女猛烈无遮档免费视频网站 | 曰批全过程免费视频播放网站 | 亚洲国产综合第一精品小说| 久久亚洲熟女cc98cm| 亚洲精品成a人在线观看| 亚洲国产天堂久久综合| 久久亚洲2019中文字幕| 亚洲一区二区三区在线观看精品中文| 成人免费福利电影| 一二三四免费观看在线视频中文版 | 亚洲色图激情文学| 亚洲无码一区二区三区| 国产亚洲精品AAAA片APP| 理论片在线观看免费| 久久精品成人免费国产片小草| www亚洲精品久久久乳| 91亚洲精品麻豆| 好看的亚洲黄色经典| 亚洲日韩区在线电影| 亚洲a∨无码男人的天堂| 日韩插啊免费视频在线观看 | 亚洲人成影院在线无码观看| 亚洲中文字幕无码久久综合网| 国产免费爽爽视频免费可以看| 黄页网站免费观看| 四虎影视www四虎免费| 又大又黄又粗又爽的免费视频| 天天干在线免费视频| 中文字幕av无码无卡免费| 8x8x华人永久免费视频| 小日子的在线观看免费| a在线视频免费观看| 好猛好深好爽好硬免费视频|