📄 unix 屏幕导向程序的发展利器1.htm
字号:
当使用 attron() 开启某一种特殊属性模式後, 接下来在屏幕的输出都会以 该种属性出现. 直到您呼叫 attroff() 将此模式关闭. 请注意, 当您欲 attron() 开启另一种属性时, 请记得利用 attroff()先关 闭原来的属性, 或直接以 attrset(A_NORMAL) 将所有特殊属性关闭.否则, curses 会将两种属性做重叠处理. □例: attrset(A_NORMAL); /* 先将属性设定为正常模式 */ attron(A_UNDERLINE); /* 加底线 */ mvaddstr(9,10,"加底线"); /* 加底线输出一串字元 */ attroff(A_UNDERLINE); /* 关闭加底线模式, 恢复正常模式 */ attron(A_REVERSE); /* 开启反白模式 */ mvaddstr(10,10,"反白"); /* 输出一串反白字元 */ attroff(A_REVERSE); /* 关闭反白模式, 恢复正常模式 */ attron(A_BLINK); /* 开启闪烁模式 */ mvaddstr(11,10,"闪烁"); /* 输出一串闪烁字元 */ attroff(A_BLINK); /* 关闭闪烁模式, 恢复正常模式 */ attron(A_BOLD); /* 开启高亮度模式 */ mvaddstr(12,10,"高亮度"); /* 输出一串高亮度字元 */ attroff(A_BOLD); /* 关闭高亮度模式, 恢复正常模式 */ ■ 其他常用的一些函数 beep() 发出一声哔声 box(win,ch1,ch2) 自动画方框 ch1: 画方框时垂直方向所用字元 ch2: 画方框时水平方向所用字元 example: box(stdscr,'|','-'); 将以 | 及 - 围成一个方框 ■ 应用完整□例 下面所举的例子, 即完全利用刚刚所介绍的含式来完成.这个程序可将从键 盘上读取的字元显示在屏幕上, 并且可以上下左右方向键来控制光标的位置 , 当按下 [ESC] 後, 程序即结束. 您有没有发现, 这不就是一个简单全屏幕编辑器的雏形吗? #include <curses.h> /* 引进 curses.h , 并自动引进 stdio.h */ #define StartX 1 /* 决定光标初始位置 */ #define StartY 1 void initial(); main() { int x=StartX; /* 宣告 x,y 并设定其初值 */ int y=StartY; int ch; /* 宣告 ch 为整数,配合 getch() 使用 */ initial(); /* 呼叫 initial(), 启动 curses 模式, */ /* 并完成其它设定 */ box(stdscr,'|','-'); /* 画方框 */ attron(A_REVERSE); /* 开启反白模式 */ mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 处输出反白字元 */ attroff(A_REVERSE); /* 关闭反白模式 */ move(x,y); /* 将光标移至初始位置 */ do { /* 以无限回圈不断等待输入 */ ch=getch(); /* 等待自键盘输入字元 switch(ch) { /* 判断输入字元为何 */ case KEY_UP: --y; /* 判断是否"↑"键被按下 */ break; case KEY_DOWN: ++y; /* 判断是否"↓"键被按下 */ break; case KEY_RIGHT: ++x; /* 判断是否"→"键被按下 */ break; case KEY_LEFT: --x; /* 判断是否"←"键被按下 */ break; case '\r': /* 判断是否 ENTER 键被按下 */ ++y; x=0; break; case '\t': /* 判断是否 TAB 键被按下 */ x+=7; break; case 127: /* 判断是否 BACKSPACE 键被按下 */ mvaddch(y,--x,' ');/* delete 一个字元 */ break; case 27: endwin(); /* 判断是否[ESC]键被按下 */ exit(1); /* 结束 curses 模式 */ /* 结束此程序 */ default: addch(ch); /* 如果不是特殊字元, 将此字元印出 */ x++; break; } move(y,x); /* 移动光标至现在位置 */ } while (1); } void initial() /* 自定开启 curses 函数 */ { initscr(); cbreak(); nonl(); noecho(); intrflush(stdscr,FALSE); keypad(stdscr,TRUE); refresh(); } ■ 後记 学完了上述的一些命令, 相不相信您已经可以写出一个漂亮的全屏幕编辑 器了? 事实上, curses 提供的函数不下 200 个, 可是笔者认为, 一切再 复杂的函数都可以用本文提到的一些组合变化而成, 学了太多的函数, 只 是徒增自己困扰罢了. 当然, 如果您对其它函数有兴趣, 可以自行参阅 curses 说明档. ( 方法: % man curses ) 本文不过行抛砖引玉之效, 也 希望未来能陆续出现更多同学自行创作的程序. * 任何疑问及建议, 欢迎 e-mail 至 ljh@CCCA.NCTU.edu.tw. 谢谢 ! * 注一: 请参考 /usr/share/lib/termcup /usr/share/lib/terminfo/s/sun 注二: 1.如果是 BSD 的版本, 需使用 cc [file.c] -lcurses -ltermcap 来完成 compile. 2.计中工作站不知何故将原来的 /usr/5bin/cc 更改为 /usr/5bin/cc.org 因此, 您若想在计中工作站 compile curses 程序.需以 /usr/5bin/cc.org 取代 /usr/5bin/cc , 否则 compile 可能发生错误. 3.较旧版的 curses 需同时引进 curses 和 termlib 这两个 library, 因此, 您必须使用 /usr/5bin/cc [file.c] -lcurses -ltermlib 来 compile. 注三: 根据笔者的经验, 上下左右方向键应可正常使用而不会发生问题, 但其它 如 PgUp,PgDn,功能键,Home,End 等特殊键, 很容易因机器, 键盘不同而无 法使用, 因此, 若您的程序须要在不同的机器上使用, 建议您只用方向键来 控制, 其它的特殊键少用为妙. 至於 PgUp,PgDn 一些特殊键的控制方法, 由於较为复杂, 有兴趣的同学可参 考 tin 原始程序 curses.c 内所使用的一些方法.</pre><hr><script language="JavaScript" type="text/javascript"><!-- // new options introduced by Bernhard Friedrich; should work in all browsers // additional code to display date in Month Day, Year format by Robert Crooks var lutext; var lutime; var ludm; var ludd; var ludy; function sstr(a,b){ //extract substrings ret=lutime.substring(a,b); if (ret=="Jan" || ret=="01") ret="1"; if (ret=="Feb" || ret=="02") ret="2"; if (ret=="Mar" || ret=="03" || ret=="Mrz") ret="3"; if (ret=="Apr" || ret=="04") ret="4"; if (ret=="May" || ret=="05" || ret=="Mai") ret="5"; if (ret=="Jun" || ret=="06") ret="6"; if (ret=="Jul" || ret=="07") ret="7"; if (ret=="Aug" || ret=="08") ret="8"; if (ret=="Sep" || ret=="09") ret="9"; if (ret=="Oct" || ret=="Okt") ret="10"; if (ret=="Nov") ret="11"; if (ret=="Dec" || ret=="Dez") ret="12"; return ret; } lutime = unescape(document.lastModified); if (lutime.length == 17) { // Netscape 3 and higher, Internet Explorer 4 ludm = sstr(0,2); ludd = sstr(3,5); ludy = sstr(6,8); } if (lutime.length == 20) { // Netscape on MacOS ludm = sstr(0,3); ludd = sstr(4,6); ludy = sstr(16,20); } if (lutime.length == 25 || lutime.length == 24) { // Netscape 2 ludm = sstr(4,7); ludd = sstr(8,10); ludy = sstr(20,24); } if (lutime.length == 29) { // Opera 3 ludm = sstr(8,11); ludd = sstr(5,7); ludy = sstr(12,16); } if (lutime.length == 23) { // Internet Explorer 3 ludm = sstr(3,6); ludd = sstr(7,9); ludy = sstr(19,23); } lutext = ""; // US date format monthName = new Array(12) monthName[1] = 'January' monthName[2] = 'February' monthName[3] = 'March' monthName[4] = 'April' monthName[5] = 'May' monthName[6] = 'June' monthName[7] = 'July' monthName[8] = 'August' monthName[9] = 'September' monthName[10] = 'October' monthName[11] = 'November' monthName[12] = 'December' yearNow = null if (ludy.length==2) { if (ludy >= 90) { yearNow = 19 } else { yearNow = 20 } } else yearNow="" lutext += monthName[ludm] + " " + ludd + ", " + yearNow + ludy + " "; var luh; var lum; var lus; if (lutime.length == 17) { // Netscape 3 and higher, Internet Explorer 4 luh = sstr(9,11); lum = sstr(12,14); lus = sstr(15,17); } else { if (lutime.length == 25 || lutime.length == 24) { // Netscape 2 or IE 3 (US) luh = sstr(11,13); lum = sstr(14,16); lus = sstr(17,19); } else { if (lutime.length == 29) { // Opera 3 luh = sstr(17,19); lum = sstr(20,22); lus = sstr(23,25); } else { // Internet Explorer 3 (German) luh = sstr(10,12); lum = sstr(13,15); lus = sstr(16,18); } } } lutext += ((luh > 12) ? luh -12 : luh); lutext += ":" + ((lum.length < 2) ? '0' + lum : lum); lutext += ":" + ((lus.length < 2) ? '0' + lus : lus); lutext += (luh >= 12) ? " PM" : " AM"; document.write("<center>"); document.write("Last Modified " + lutext); document.write("</center>"); // --></script></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -