📄 00000002.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER> <BR> <BR> UNIX 萤幕导向程式的发展利器 - curses (二) <BR> <BR> <BR> 校园网路策进会 <BR> 会长 林建宏 <BR> <BR> <BR> 在上期为您介绍完了 curses.h 函式库的一些基本函式呼叫後在, 在本期里 <BR> , 我们将继续为您介绍 curses 有关多视窗处理的函式. 有了这些函式, 我们 <BR> 可以在程式里同时处理多个不同的视窗. 如 joe 编辑器内我们可将萤幕切割 <BR> 成好几个小萤幕, 并且可以在这些不同的萤幕间做切换并编辑不同的档案, 这 <BR> 就是多视处理的应用. 另外, 有关 POP-UP 视窗的制作, 以及视窗的卷动, 在 <BR> 本文里, 我们将以简单的例子, 告诉您这些功能是如何做到的. 关於一些较基 <BR> 本函式的用法, 我们将不再特别介绍. 如果您尚未熟悉 curses 基本函式使用 <BR> 方法, 请参阅上一期 (80 期 ) 通讯. <BR> <BR> <BR> ■ 视窗的建立 <BR> <BR> 视窗的建立, 以 newwin() 这个函式来完成. 同时, 需宣告此视窗为 WINDOW <BR> 结构变数. <BR> <BR> WINDOW *newwin(lines,colums,start_y,start_x); <BR> <BR> <BR> WINDOW *win; <BR> win=newwin(10,20,0,0); <BR> <BR> 如此, 将以 (0,0) 为原点, 取一个 10 列 20 行的矩形为一新的视窗. 今後 <BR> 我们只要呼叫 win 这个变数, 就可以对这新视窗做处理. <BR> <BR> 如: wmove(win,3,2); <BR> <BR> <BR> ■ 多视窗处理函式的格式 <BR> <BR> 这一类函式和一般的基本函式极为类似, 几乎每一个基本函式都有一个对应的 <BR> 视窗处理函式. 一般将 'w' 加在函式的里头作为区别, 'w' 乃 'window' 之 <BR> 意. 另外, 因为可同时处理多个视窗, 在呼叫使用时, 需特别指定欲处理的视 <BR> 窗. 当然, 如果您指定对 stdscr 做处理, 由於是对标准输出入萤幕处理, 其 <BR> 作用将相当於一般基本的函式. <BR> <BR> 如: <BR> <BR> wmove(win,y,x) 即对 win 这个视窗做 move() 动作. <BR> wmove(stdscr,y,x) 相当於 move(y,x) <BR> <BR> 介绍一些较重要的函式 <BR> <BR> wmove(win,y,x) <BR> touchwin(win) <BR> wrefresh(win) <BR> mvwaddstr(win,y,x,str) <BR> wattron(attr) <BR> delwin(win) <BR> subwin(win,ny,nx,y,x) <BR> <BR> 其他函式多和基本函式互为对应, 故不全部列出, 详细名称可参考 curses <BR> 的 online manual. <BR> <BR> ■ 视窗内的座标系 <BR> <BR> 视窗内的座标系, 将以此视窗的起始点为新原点, 并以其相对位置作为新的 <BR> 座标. 举例来说 <BR> <BR> win=newwin(10,20,5,5); <BR> wmove(win,2,3); <BR> <BR> 将以 (5,5) 为新原点, y 方向移动 2 单位, x 方向移动 3 单位. 因此实际 <BR> 上, 游标将移动至 y=7 x=8 的位置上. <BR> <BR> <BR> ■ POP-UP 视窗的建立 <BR> <BR> 利用 curses 所提供的视窗处理函式, 我们可以做出像 ONLINE HELP 的 POP <BR> -UP 画面. 当按下某键後, 一个新的视窗将像 " 跳 " 出来一般覆盖原来的画 <BR> 面. 当关掉此视窗後, 又不会影响到原来被覆盖的画面. <BR> <BR> <BR> 下面的例子, 我们及模拟 ONLINE HELP 的形式, 当按下 'h' 键时, 视窗即出现 <BR> <BR> <BR> #include <curses.h> <BR> <BR> main() <BR> { <BR> int ch,x,y; <BR> WINDOW *win; <BR> <BR> initscr(); ←┐ <BR> cbreak; │ 启动 curses 模式 <BR> noecho(); │ <BR> nonl(); ←┘ <BR> <BR> win=newwin(4,30,LINES/2-3, COLS/2-15);/* 建立一个新视窗, 其中LINES,COLS <BR>*/ <BR> box(win,'|','-'); /* 为 curses 内定值, <BR>即萤幕行/列数*/ <BR> mvwaddstr(win,1,4,"This is another screen"); <BR> mvwaddstr(win,2,2,"Press anykey to continue.."); <BR> <BR> for (y=0;y<LINES;++y) /* 以'@'填满萤幕 */ <BR> for (x=0;x<COLS;++x) <BR> mvprintw(y,x,"@"); <BR> <BR> for(;;) { <BR> refresh(); <BR> ch=getch(); <BR> switch(ch) { <BR> case 'q': /* 按 'q' 键离开 */ <BR> endwin(); <BR> exit(0); <BR> <BR> case '\t': /* 按 [TAB] 键 呼叫另一视窗 */ <BR> touchwin(win); /* wrefresh() 前需 touchwin() */ <BR> wrefresh(win); <BR> getch(); /* 按任意键关闭视窗 */ <BR> touchwin(stdscr); <BR> break; <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -