1、安装Ncurses

Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。

Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以:

· 只要您喜欢,您可以使用整个屏幕

· 创建和管理一个窗口

· 使用8种不同的彩色

· 为您的程序提供鼠标支持

· 使用键盘上的功能键

Ubuntu下

mysea@mysea-desktop:~$ sudo apt-get install libncurses5-dbg libncurses5-dev

mysea@mysea-desktop:~/test$ gcc -lncurses -o cursestest cursestest.c

Freebsd下

cd /usr/ports/devel/ncurses-devel

make install clean

2、hello,world

#include

int main(void){

initscr();//初始化

box(stdscr,ACS_VLINE,ACS_HLINE);//画边框

mvaddstr(15,2,"hello,world");//在15,2显示字符串

refresh();//刷新屏幕

getch();//等待按键

endwin();//结束

return 0;

}

编译及运行

dp@dp:~/cursestest % gcc -lncurses 1.c -o mytest

dp@dp:~/cursestest % ./mytest

3、色彩

然后编写下面代码:

#include

#include

#include

int main(void){

//init_pair(short index,short foreground,short background)初始化颜色索引

//attron(COLOR_PAIR(索引号)|属性)

setlocale(LC_ALL,"");

initscr();//初始化

box(stdscr,ACS_VLINE,ACS_HLINE);//画边框

if (!has_colors()||start_color()==ERR){

endwin();

printf("终端不支持颜色\n");

return 0;

}

init_pair(1,COLOR_GREEN,COLOR_BLACK);

init_pair(2,COLOR_RED,COLOR_BLACK);

init_pair(3,COLOR_WHITE,COLOR_BLUE);

int i=0;

for (i=1;i<=3;i++){

attron(COLOR_PAIR(i));

move(i,10);

printw("hello,world:%d",i);

}

for (i=1;i<=3;i++){

attron(COLOR_PAIR(i)|A_UNDERLINE);

move(i+5,10);

printw("hello,world:%d",i);

}

refresh();//刷新屏幕

getch();//等待按键

endwin();//结束

执行

4、对中文的支持

dp@dp:~/cursestest % cat 1.c

#include

#include

#include

int main(void){

//init_pair(short index,short foreground,short background)初始化颜色索引

//attron(COLOR_PAIR(索引号)|属性)

setlocale(LC_ALL,"");

initscr();//初始化

box(stdscr,ACS_VLINE,ACS_HLINE);//画边框

if (!has_colors()||start_color()==ERR){

endwin();

printf("终端不支持颜色\n");

return 0;

}

init_pair(1,COLOR_GREEN,COLOR_BLACK);

init_pair(2,COLOR_RED,COLOR_BLACK);

init_pair(3,COLOR_WHITE,COLOR_BLUE);

int i=0;

for (i=1;i<=3;i++){

attron(COLOR_PAIR(i));

move(i,10);

printw("hello,世界%d",i);

}

for (i=1;i<=3;i++){

attron(COLOR_PAIR(i)|A_UNDERLINE);

move(i+5,10);

printw("hello,世界:%d",i);

}

refresh();//刷新屏幕

getch();//等待按键

endwin();//结束

return 0;

}

编译时注意要使用ncursesw库,不使用ncurses库

dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest

dp@dp:~/cursestest % ./mytest

5、窗口与子窗口

#include

#include

int main(){

//init_pair(short index,short foreground,short background)初始化颜色索引

//attron(COLOR_PAIR(索引号)|属性)

//newwin建立窗口,derwin建立窗口的子窗口(相对于父窗口相对位置),subwin建立窗口的子窗口(相对于根窗口绝对位置)

setlocale(LC_ALL,"");

WINDOW *win1,*win2,*subwin;

initscr();//初始化

win1=newwin(15,50,1,1);//新窗口(行,列,begin_y,begin_x)

box(win1,ACS_VLINE,ACS_HLINE);

mvwprintw(win1,1,1,"WIN1");

mvwprintw(win1,2,1,"您好,很高兴认识您");

win2=newwin(10,40,10,30);//新窗口(行,列,begin_y,begin_x)

box(win2,ACS_VLINE,ACS_HLINE);

mvwprintw(win2,1,1,"WIN2");

mvwprintw(win2,2,1,"您好,很高兴认识您");

subwin=derwin(win2,3,20,3,5); //子窗口

box(subwin,ACS_VLINE,ACS_HLINE);

mvwprintw(subwin,1,5,"按任意键退出");//(窗口,y,x,字符串)

refresh();//刷新整个大窗口stdscr

wrefresh(win1);

wrefresh(win2);

touchwin(win1);//转换当前窗口为win1

wrefresh(win1);

getch();//win1显示完,等待按键显示win2

touchwin(win2);//转换当前窗口为win2

//使用doupdate,可以事先定义要刷新的部分,然后刷新

wnoutrefresh(win2);

wnoutrefresh(subwin);

doupdate();

getch();//等待按键

delwin(win1);

delwin(subwin);

delwin(win2);

endwin();//结束

return 0;

}

dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest

dp@dp:~/cursestest % ./mytest

6、自动滚屏

#include

#include

int main(void){

int y,x,i,j,h,w;

setlocale(LC_ALL,"");

WINDOW *pad;

initscr();//初始化

getmaxyx(stdscr,h,w);//获得屏幕尺寸

//画背景

for(i=0;i

for(j=0;j

mvaddch(i,j,ACS_CKBOARD);

}

}

refresh();

//建立窗口

pad=newpad(80,90);

for (i=0;i<80;i++){

char line[90];

sprintf(line,"line %d\n",i);

mvwprintw(pad,i,1,line);

}

refresh();

prefresh(pad,0,1,5,10,20,25);//刷新pad。0,1 为基垫需要显示区域的左上角置(行列对,以下同此)。5,10,20,45为屏幕显示区域的左上角和右下角位置

for(i=0;i<65;i++){

prefresh(pad,i+1,1,5,10,20,25);//刷新pad,实现流屏;

usleep(30000);

}

getch();//等待按键

delwin(pad);

endwin();//结束

return 0;

}

dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest

7、在窗口中移动光标

#include

#include

int main(void){

//init_pair(short index,short foreground,short background)初始化颜色索引

//attron(COLOR_PAIR(索引号)|属性)

//newwin建立窗口,derwin建立窗口的子窗口(相对于父窗口相对位置),subwin建立窗的子窗口(相对于根窗口绝对位置)

int x,y;

setlocale(LC_ALL,"");

WINDOW *win1,*win2,*subwin;

initscr();//初始化

win1=newwin(15,50,1,1);//新窗口(行,列,begin_y,begin_x)

box(win1,ACS_VLINE,ACS_HLINE);

mvwprintw(win1,1,1,"WIN1");

mvwprintw(win1,2,1,"myhaspl@myhaspl.com");

win2=newwin(10,40,10,30);//新窗口(行,列,begin_y,begin_x)

box(win2,ACS_VLINE,ACS_HLINE);

wmove(win2,1,1);//移动某窗口的光标

printw("WIN2");

wmove(win2,2,1);//移动某窗口的光标。(窗口,y,x)

printw("myhaspl@myhaspl.com");

subwin=derwin(win2,3,20,4,5); //子窗口

box(subwin,ACS_VLINE,ACS_HLINE);

mvwprintw(subwin,1,5,"按任意键退出");//(窗口,y,x,字符串)

refresh();//刷新整个大窗口stdscr

wrefresh(win1);

wrefresh(win2);

move(5,60);//在stdscr移动光标

printw("hello.........");

touchwin(win1);//转换当前窗口为win1

wrefresh(win1);

getch();//win1显示完,等待按键显示win2

touchwin(win2);//转换当前窗口为win2

//使用doupdate,可以事先定义要刷新的部分,然后刷新

wnoutrefresh(win2);

wnoutrefresh(subwin);

doupdate();

getyx(subwin,y,x);//获得当前逻辑光标位置

mvwprintw(subwin,y+1,x,"................");//在“按任意键退出"下一行输出"..............."

getch();//等待按键

delwin(win1);

delwin(subwin);

delwin(win2);

endwin();//结束

return 0;

}

编译后运行

dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest

8、菜单

#include

#include

#include

#include

//定义菜单项

static const char *menus[]={

"1-1","1-2","1-3","2-1","2-2","2-3"

};

#define CITEM sizeof(menus)/sizeof(menus[0])//菜单项数

ITEM *items[CITEM];

int main(int argc,char *argv[]){

int i;

int ch;

int mrows,mcols;

WINDOW *win,*subwin;

MENU *mymenu;

//初始化屏幕

initscr();

//不用等待回车键

cbreak();

//不回显

noecho();

//可以处理功能键

keypad(stdscr,TRUE);

//建立菜单项

for(i=0;i

items[i]=new_item(menus[i],menus[i]);//第二个参数为菜单项的描述

}

//建立菜单

mymenu=new_menu(items);

set_menu_format(mymenu,CITEM,1); //设置CITEM行1列的菜单

set_menu_mark(mymenu,">");//菜单选中的MARK

//获得菜单的行列数

scale_menu(mymenu,&mrows,&mcols);

//建立窗口和子窗口

win=newwin(mrows+2,mcols+2,3,30);

keypad(win,TRUE);

box(win,0,0);

subwin=derwin(win,0,0,1,1);

//设置菜单的窗口

set_menu_sub(mymenu,subwin);

//在子窗口上放置菜单

post_menu(mymenu);

refresh();

wrefresh(win);

//获得输入,并移动选择到相应的菜单项

while(toupper(ch=wgetch(win))!='\n'){

if(ch==KEY_DOWN)

menu_driver(mymenu,REQ_DOWN_ITEM);//移动菜单选择

else if(ch==KEY_RIGHT)

menu_driver(mymenu,REQ_RIGHT_ITEM);

else if (ch==KEY_UP)

menu_driver(mymenu,REQ_UP_ITEM);

else if (ch==KEY_LEFT)

menu_driver(mymenu,REQ_LEFT_ITEM);

}

//输出当前项

mvprintw(LINES-2,0,"you select the item :%s\n",item_name(current_item(mymenu)));

refresh();

unpost_menu(mymenu);

getch();

//释放内存

free_menu(mymenu);

for(i=0;i

endwin();

return 1;

}

编译并运行

dp@dp:~/cursestest % gcc -lncursesw -lmenu 2.c -o mytest

ncurses下c语言定位光标,C指针原理教程之Ncurses介绍相关推荐

  1. linux下c语言编程书籍6,Linux下C语言编程-6.pdf

    永远的下语言编程基础知识 页码, 首页编程技术正文 L inux下C语言编程 - -基础知识 作者 前言 这篇文章介绍在下进行语言编程所需要的基础知识在这篇文章当中我们将会学 内容 源程序编译 的编写 ...

  2. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 二、C语言里的函数指针...

    二.C语言里的函数指针 上一节里介绍了回调函数,模块A提供了该函数 然后模块A调用B B再返过来调用A提供的函数,再处理最后返回结果给A.晕了.还是画个图.一般调用情况: 图2-1 有回调函数的调用情 ...

  3. C语言什么时候必须用到二级指针?(需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针)

    结论:需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针 例子:为空指针p开辟内存空间 1.不用二级指针(无法实现) #include <stdio.h> ...

  4. C语言SetConsoleCursorPosition()函数来定位光标位置

    SetConsoleCursorPosition(参数1,参数2)函数来定位光标位置. 参数1:句柄(通过GetStdHandle()函数获得句柄) 参数2:位置(结构体类型) 位置如下 #inclu ...

  5. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍  3)Linux程序设计入门--文件操作  4)Linux程序设计入门--时间概念  5)Linux程序设计入门--信号处理  6)Linux程序设计入门--消 ...

  6. 【C语言项目实战6——指针以及应用】

    文章目录 学生管理系统链表问题 项目功能需求 知识点分析 算法思想 系统流程图 项目实现 项目小结 参考文献 学生管理系统的代码: 约瑟夫链表问题 知识点分析 算法思想 系统流程图 项目实现 项目小结 ...

  7. C 语言编程 — 高级数据类型 — 指针

    目录 文章目录 目录 前文列表 指针 声明一个指针变量 使用指针 空指针 悬空指针 野指针 指针的算术运算 指向指针的指针 将指针作为实际参数传入函数 从函数返回指针 一个古老的笑话 前文列表 < ...

  8. C语言高级篇 - 1.C语言复杂表达式和指针高级应用

    1.指针数组与数组指针 1.1.字面意思来理解指针数组与数组指针 (1)指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量. (2)数组指针的实质是一个指针,这个指针指向的是一个数组. 1. ...

  9. 关于Linux下C语言开发基础的实验内容。

    Linux下C语言开发基础实验内容 目录 1.Linux下C语言开发流程 2.vi,vim编辑器的使用 3.Gcc编译器的使用 总体选项: 警告选项: 4.GDB 基本命令的使用 5.Make 工程管 ...

最新文章

  1. 『TensorFlow』卷积层、池化层详解
  2. Android中的线程处理
  3. 3d激光雷达开发(平面分割)
  4. c语言状态机实现坐标切换,C语言状态机最优模式(转)
  5. 如何优雅地用ARM开发板搭建服务器
  6. 开课吧:为什么AI工程师都要懂一点架构呢?
  7. Screaming Frog SEO Spider for Mac进行网页抓取和数据提取的技巧
  8. python time函数的功能_Python中Python时间模块的常用功能,Pythontime,函数
  9. 地震设计反应谱、时程分析法和地震动选取与调整
  10. 深度学习目标检测之SSD网络(超级详细)
  11. antd表格分页设置
  12. Linux系统自动校准时间
  13. 萤石云视频预览、回放、自定义录制
  14. 智能管家App kotlin版(1)——框架搭建
  15. 联想一体机计算机用户名锁定,联想电脑输入密码多次被锁定怎么办
  16. 最短路问题的线性规划模型
  17. 实现一个简单的图片轮播效果
  18. 更换VScode背景图,设置VScode背景为你喜欢的图片
  19. 因为洋红色被告垄断,德国电信心塞
  20. php 表格模板,怎么制作excel表格模板

热门文章

  1. Fish Redux中的Dispatch是怎么实现的?
  2. Tensorflow快餐教程(6) - 矩阵分解
  3. 天天讲路由,那 Linux 路由到底咋实现的!?
  4. 看完这篇 HashMap ,和面试官扯皮就没问题了
  5. HR怒甩程序员男友:不加班没上进没前途,网友:惹不起
  6. C++和Lua交互教程(基于LuaBridge)
  7. findler mac 隐藏文件_fiddler使用实例之----------查找隐藏的真实地址!!!!
  8. java log4j logback jcl_Java 日志二三事
  9. linux bash环境,Win10系统怎样启用Linux Bash环境
  10. Php中跳转语句goto,phpgoto语句