需要搞明白一点的是,前面是对terminal进行操作,这个是对X window进行操作。所以从本质上来讲是不一样的。但是用起来感觉没什么大不同。。
1. initscr(), endwin()
init之后,整个屏幕被刷掉,生成一个新屏幕。在这里只能用curses里面的printw,scanw之类的。因为这是它自己的屏幕。之后endwin()退出。
2. move(x,y)
封装得够简单了。
3. attron, attroff
对输出属性进行设置,试一下就知道了。
至于属性设置参考这里:
http://www.mkssoftware.com/docs/man3/curs_attr.3.asp
4. refresh()
把整个屏幕刷新一遍。比如initscr之后,如果不refresh,那么屏幕原来有的还在,很混乱。
本来应该是所有动作之后都应该refresh一下,但是有些试了下不要也行。个人猜测是覆盖的原因。如果有覆盖的话要refresh().
还有一点要注意的就是,必须有change 才会刷新。如果没有change还是不变的。如果没有change硬要刷新的话也行,用touchwin(WINDOW).
5. cbreak(), echo()
前者相当于之前的non-canonical,就是不是一行输入了。变成一个个输入,包括换行。
后者指定是否回显。
实践代码如下,因为都是终端运行即可见了,所以样例也不用贴了。
代码一:
*注意一点:中间getchar()的时候,不论输入什么也不会回显的。这是因为被流弄走了,但是不会保留在window上。而getstr(), getch()则会留在屏幕上,如果不把echo()关掉的话。
/*
* =====================================================================================
*
* Filename: screen1.c
*
* Description: Uses of curses.h
*
* Version: 1.0
* Created: Wednesday, January 11, 2012 02:55:22 HKT
* Revision: none
* Compiler: gcc
*
* Author: Hongchao Deng (fengjingchao), fengjingchao@gmail.com
* Company: Sun Yat-sen University
*
* =====================================================================================
*/
#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <curses.h>
#define PW_LEN 256
#define NAME_LEN 256
/*
* === FUNCTION ======================================================================
* Name: main
* Description: main function
* =====================================================================================
*/
int
main ( int argc, char *argv[] )
{
/* Parameters */
char *scan_ptr;
char witch_one[] = "First Witch ";
char witch_two[] = "Second Witch ";
/* TODO */
initscr();
move(5,15);
attron(A_BOLD);
printw("%s", "Macintosh");
attroff(A_BOLD);
refresh();
getchar();
move(8,15);
attron(A_STANDOUT);
printw("Thunder and lighting");
attroff(A_STANDOUT);
refresh();
getchar();
move(10,10);
printw("TEST PRINT");
move(11,23);
printw("TEST PRINT");
refresh();
getchar();
attron(A_DIM);
scan_ptr = witch_one + strlen(witch_one) - 1;
while(scan_ptr != witch_one){
move(10,10);
insch(*--scan_ptr);
}
attroff(A_DIM);
refresh();
getchar();
move(LINES -1, COLS -1);
printw("%s",witch_two);
refresh();
getchar();
clear();
char name[NAME_LEN];
char password[PW_LEN];
char *real_password = "123456";
move(5,10);
printw("Please login");
move(7,10);
printw("User name: ");
getstr(name);
move(8,10);
printw("Password: ");
// refresh();
cbreak();
noecho();
memset(password,0,sizeof(password));
int i=0;
for(;i<PW_LEN;i++){
password[i] = getch();
if( password[i] == '\n') break;
move(8,20+i);
addch('*');
// refresh();
}
echo();
nocbreak();
endwin();
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
代码二:
展示多个window的情况
/*
* =====================================================================================
*
* Filename: multiw.c
*
* Description: Managing Multiple Windows
*
* Version: 1.0
* Created: Wednesday, January 11, 2012 07:42:44 HKT
* Revision: none
* Compiler: gcc
*
* Author: Hongchao Deng (fengjingchao), fengjingchao@gmail.com
* Company: Sun Yat-sen University
*
* =====================================================================================
*/
#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <curses.h>
/*
* === FUNCTION ======================================================================
* Name: main
* Description: main function
* =====================================================================================
*/
int
main ( int argc, char *argv[] )
{
WINDOW *new_window_ptr;
WINDOW *popup_window_ptr;
int x_loop;
int y_loop;
char letter = 'a';
initscr();
move(5,5);
printw("Testing multiple windows");
refresh();
sleep(1);
for ( y_loop = 0;y_loop < LINES -1 ;++y_loop ) {
for (x_loop = 0; x_loop < COLS -1; ++x_loop) {
mvaddch(y_loop,x_loop,letter);
letter++;
if(letter >'z') letter = 'a';
}
}
refresh();
getchar();
new_window_ptr = newwin(10,20,5,5);
mvwprintw(new_window_ptr,2,5,"Testing multiple windows");
mvwprintw(new_window_ptr,5,10,"*********************************************************");
wrefresh(new_window_ptr);
getchar();
letter = '0';
for ( y_loop = 0;y_loop < LINES -1 ;++y_loop ) {
for (x_loop = 0; x_loop < COLS -1; ++x_loop) {
mvaddch(y_loop,x_loop,letter);
letter++;
if(letter >'9') letter = '0';
}
}
refresh();
getchar();
wrefresh(new_window_ptr);
getchar();
touchwin(new_window_ptr);
wrefresh(new_window_ptr);
getchar();
endwin();
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */