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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菜鸟linux的sed,Linux sed命令菜鸟入门

本文首先以一个简单的sed命令应用示例&#xff0c;说明如何使用sed命令进行文本处理&#xff0c;接着从sed命令的用法、工作原理、行地址模式以及sed命令支持的脚本命令详细介绍sed命令的用法。一个完整的sed命令使用简单示例现在有一个待处理文件test.txt&#xff0c;文件中包…

android xml 列表展示,Android中ListView实现展示列表数据

1、在activity_main.xml中添加一个ListViewxmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"wrap_content"android:orientation"vertical"tools:context"${relativePack…

android的证书链管理,Android手册X509证书链验证

我已在我的代码中实现了javax.net.ssl.X509TrustManager,因此我可以验证我的软件访问的自签名证书.但是,我仍然需要验证其他一些“标准”网站SSL证书.我使用CertPathValidator.validate()来做到这一点,但我刚刚意识到我传递的一个证书链(对于maps.googleapis.com)实际上并不包含…

lua android弹窗关闭,安卓精灵lua调用pm指令实现清除App缓存,举个栗子的说

今天刚接触这玩意&#xff0c;试着写点Demo玩玩, 功能要求能自动登陆&#xff0c;在登陆前要先清空游戏的缓存数据&#xff0c;不然游戏就自动登陆了(无法切到账号输入窗口)本想写图色脚本来实现吧&#xff0c;多种品牌的手机&#xff0c;多种模拟器&#xff0c;多种桌面主题&a…

android打印html页面,Android打印HTML文档

来源官网,总结用.WebView类在Android 4.4(API Level 19)中得到了更新&#xff0c;使得它可以打印HTML内容。该类允许我们加载一个本地HTML资源或者从网页下载一个页面&#xff0c;创建一个打印任务&#xff0c;并把它交给Android打印服务。1.[代码]如何构建一个HTML的字符串并将…

cocos android-1,Cocos2D-Android-1之源码详解:5.Box2dTest

Cocos2D-Android-1之源码详解&#xff1a;5.Box2dTest发布时间&#xff1a;2020-08-06 06:19:28来源&#xff1a;51CTO阅读&#xff1a;398作者&#xff1a;abab99package org.cocos2d.tests;import java.util.Iterator;import org.cocos2d.actions.UpdateCallback;import org.…

三星s10能升级android11,三星 S10+手机已在测试 Android 11 系统

IT之家2月25日消息 谷歌本月初发布了首个Android 11开发者预览版&#xff0c;首先面向Pixel手机&#xff0c;不过看起来三星已经在Galaxy S10 手机开始测试最新系统。IT之家从Geekbench数据库中获知&#xff0c;上面出现了运行Android R&#xff0c;型号为SM-G975F的三星Galaxy…

android 5. 蓝牙 mesh,蓝牙mesh组网

智能照明是智能家居的一个重要入口&#xff0c;传统照明方案存在布线复杂&#xff0c;控制单一等问题。搭配飞易通MESH组网模组替换传统方案&#xff0c;无需额外的布线。提供更智能的控制&#xff0c;更极致的用户体验。一、MESH应用领域:蓝牙5.0MESH是由SIG蓝牙联盟发布建立的…

android opencv 银行卡识别,NDK 开发之使用 OpenCV 实现银行卡号识别

前言在日常的开发中&#xff0c;我们有时会遇到添加银行卡的需求&#xff0c;这时候&#xff0c;产品可能会让你仿一下支付宝之类的相机扫描识别银行卡号。很多时候&#xff0c;做这样的需求会去找找稳定的第三方&#xff0c;本文通过 OpenCV 结合识别的需求带你分析如何实现银…

鸿蒙测试机型微博,华为多款机型开启鸿蒙尝鲜:微博已适配HarmonyOS小尾巴

日前&#xff0c;华为已经正式宣布&#xff0c;将于6月2日晚20点召开鸿蒙操作系统及华为全场景新品发布会&#xff0c;届时将正式发布鸿蒙OS正式版。同时&#xff0c;今天华为还开启了鸿蒙OS首批消费者尝鲜计划&#xff0c;其中正式版可参与机型包括Mate 40系列、Mate X2、Mate…

android今日头条刷新,仿今日头条刷新vector动画

一般的刷新动画是一个圈圈在转&#xff0c;而头条的比较特殊&#xff0c;直接上写好的效果图(一直不知道怎么把图片尺寸调小o(╯□╰)o)吧~刷新动画_.gif首先整个效果是通过SVG和vector来实现的&#xff0c;如果不是很了解&#xff0c;请看大佬的文章&#xff1a;SVG学习--Anim…

android懒加载单实例,【 Android 10 设计模式 】系列 -- 单例

前言由于源码分析的代码量比较大&#xff0c;大部分博客网站的内容显示页面都比较窄&#xff0c;显示出来的效果都异常丑陋&#xff0c;所以您也可以直接查看 《 Thinking in Android 》 来阅读这边文章&#xff0c;希望这篇文章能帮你梳理清楚 “ 单例模式 ”。一、概述1.1 什…

android资产目录,android – 从非目录设备中的资产文件夹复制数据库

我正在尝试从资产文件夹将数据库复制到设备.此代码在模拟器和根设备上正常工作.我只是想知道是否在无人看管的设备上创建任何问题,否则它会相同.private void StoreDatabase() {File DbFile new File("data/data/packagename/DBname.sqlite");if (DbFile.exists()) …

在html中标题字号一共有几种,HTML中常用的几种标签

在HTML中&#xff0c;标签是首要的&#xff0c;也是最重要的东西。一旦进入HTML&#xff0c;认识和理解标签是基本的需要&#xff0c;因为这是区分HTML代码与普通文本的分隔符。这些标签是用来显示文档中的普通文本或转化文本的指令的标签。什么是转化后的文本&#xff1f;要显…

html静态页面引用其他页面,Shtml完美解决静态页面内部调用其他页面(非Iframe、Object、Js方法)...

我想这个是所有前端工程师都会碰到的问题&#xff0c;在你做了很多页面&#xff0c;需要调用同一个头部或者底部的时候&#xff0c;需要嵌套一下&#xff0c;这个时候怎么办Iframe、Object、Js调用的方法就不讨论了&#xff0c;网上搜索一大堆&#xff0c;不过兼容性不好这里给…

鸿蒙手机如何录屏,安卓手机如何屏幕录制视屏?手机视频录制方法

安卓手机如何屏幕录制视屏&#xff1f;手机视频录制方法2018年12月17日 17:05作者&#xff1a;黄页编辑&#xff1a;黄页分享随着科技的不断进步发展,手机已经成为人类不可缺少的一种生活神器,人们已经不满足只是用来打打电话、发发短信那么简单了,手机的用途主要用来社交、娱乐…

html判断为空的函数,javascript怎么判断是否为空字符串?

JavaScript中可以使用if(typeof obj"undefined"||objnull||obj"")语句通过判断字符串的数据类型来判断字符串是否为空。判断字符串是否为空的方法函数&#xff1a;function isEmpty(obj){if(typeof obj "undefined" || obj null || obj "…

html或原生js是单一对应绑定的,原生js数据绑定

双向数据绑定是非常重要的特性 —— 将JS模型与HTML视图对应&#xff0c;能减少模板编译时间同时提高用户体验。我们将学习在不使用框架的情况下&#xff0c;使用原生JS实现双向绑定 —— 一种为Object.observe_(译注&#xff1a;现已废弃&#xff0c;作者写博客时为14年11月)&…

et200sp模块接线手册_西门子PN/PN耦合器学习应用系列(1)-外观及接线

早在2017年我曾写过两篇文章介绍西门子PN/PN耦合器&#xff0c;文章链接如下&#xff1a;初识西门子PNPN耦合器(PN/PN Coupler)&#xff1b;如何在博途(TIA Portal)环境下组态PNPN耦合器&#xff1f;当时PN/PN耦合器的固件版本还是V3.x。随着产品的升级&#xff0c;新版本的PN/…

textview加载html glide,TextView加载HTML,文字和图片

原文出处链接&#xff1a;《TextView加载HTML&#xff0c;文字和图片》工具类&#xff1a;public class ImageGetterUtils {public static MyImageGetter getImageGetter(Context context, TextView textView) {MyImageGetter myImageGetter new MyImageGetter(context, textV…