当前位置: 首页 > news >正文

ncurse编程指南

文章目录

      • 0. 介绍
      • 1. Hello, Ncurse
      • 2. 初始化函数
        • 2.1 raw() 和 cbreak()
        • 2.2 echo()和noecho()
        • 2.3 keypad()
        • 2.4 halfdelay()
        • 2.5 初始化样例
      • 3. 命名规范
      • 4. 输出函数
        • 4.1 addch()类函数
        • 4.2 printw()类函数
        • 4.3 addstr()类函数
        • 4.4 注意
        • 4.5 输出函数例子
      • 5. 输入函数
        • 5.1 getch()
        • 5.2 scanw()
        • 5.3 getstr()
        • 5.4 输入例子
      • 6. 属性
        • 6.1 属性使用例子
        • 6.2 属性值
        • 6.3 attrset() 与 attron()区别
        • 6.4 attrget()
        • 6.5 attr_系列函数
        • 6.6 chgat()函数
      • 7. 窗口
        • 7.1 窗口相关函数
        • 7.2 使用样例1
        • 7.3 使用样例2
      • 8. 颜色
        • 8.1 代码示例
        • 8.2 颜色宏定义
        • 8.3 改变颜色定义
        • 8.4 颜色内容
        • 8.5 chgat()函数
      • 9. 键盘交互
        • 9.1 基本用法
        • 9.2 使用范例
      • 10. 与鼠标交互
        • 10.1 基本介绍
        • 10.2 监听鼠标事件
        • 10.3 使用实例
      • 11. 屏幕操作
        • 11.1 getyx(win, y,x )
        • 11.2 scr_dump()
        • 11.3 窗口保存
      • 12. 杂项
        • 12.1 cur_set()
        • 12.2 暂时离开curse模式
        • 12.3 ACS_标量
      • Ref

0. 介绍

linux下的图形库

1. Hello, Ncurse

在屏幕左上角打印Hello, World

#include <ncurse.h>int main()
{initscr(); // 初始化屏幕,默认stdscrprintw("Hello World");// 与printf相似但是打印到虚拟窗口stdscrrefresh();// 需要刷新才能显示到屏幕上getch(); // 等待用户输入endwin(); // 关闭窗口return 0;
}

2. 初始化函数

2.1 raw() 和 cbreak()

都是关闭行缓冲,两者的区别是raw不会产生信号(CTRL+C CTRL +Z)。

2.2 echo()和noecho()

输入的内容是否回显

2.3 keypad()

开启功能按键,F1、F2、方向键等。
用法:

keypad(stdscr, TRUE)
2.4 halfdelay()

延迟等待多少秒,若没反应则返回一个ERR。

2.5 初始化样例
#include <ncurses.h>
int main()
{ int ch;initscr();raw(); keypad(stdscr, TRUE); /* 获取功能按钮 */noecho(); /* 不回显 */printw("Type any character to see it in bold\n");ch = getch();if(ch == KEY_F(1)) /* 按下F1键 */printw("F1 Key pressed");else{ 	printw("The pressed key is ");attron(A_BOLD); // 加粗printw("%c", ch);attroff(A_BOLD);}refresh(); /*虚拟屏幕打印到实际屏幕 */getch(); endwin(); return 0;
}

3. 命名规范

ncursew前缀的都是指定窗口,带mv的都是移动到(x,y)进行操作。

比如

printw(string);// 在stdscr当前位置打印字符串mvprintw(y, x, string);/* 到(y,x)处打印字符串*/wprintw(win, string); /* 在窗口win上打印字符串*/mvwprintw(win, y, x, string); /* 移动到win窗口的(y,x)位置打印字符串*/

4. 输出函数

4.1 addch()类函数

输出单个字符,移动游标。
还有

mvaddch(row, col, c)
waddch(win, c)
mvwaddch(win, row, col, c)

字符有颜色、加粗等属性。可以通过两种方式添加

  1. 字符或属性值
    addch(ch | A_BOLD | A_UNDERLINE)
  2. 属性设置函数
    attron() attroff() attrset()后面介绍
4.2 printw()类函数

输出字符串,与printf类似。

printw(str)
wprintw(win, str);
mvwprintw(y,x,win,str)
vwprintw() => vprintf()
4.3 addstr()类函数

给指定窗口输出字符串

addstr()
mvaddstr()
....
4.4 注意

这些函数都是(y,x), 首先传入纵轴,再是横轴。

4.5 输出函数例子

getmaxyx()是获取窗口大小的函数。

#include <ncurses.h>
#include <string.h> 
int main()
{char mesg[]="Just a string"; int row,col;initscr(); getmaxyx(stdscr,row,col); /* 获取屏幕的大小 */mvprintw(row/2,(col−strlen(mesg))/2,"%s",mesg);/*在屏幕中央打印字符串 */mvprintw(row−2,0,"This screen has %d rows and %d columns\n",row,col);printw("Try resizing your window(if possible) and then run this program again");refresh();getch();endwin();return 0;
}

5. 输入函数

5.1 getch()

输入单个函数。cbreak()关闭行缓冲,noecho()关闭回显。

5.2 scanw()

sscanf类似,通过wgetstr获取的行来进行扫描。

scanw()
wscanw()
mvwscanw()
vwscanw() => vscanf()
5.3 getstr()

获取一个字符串

5.4 输入例子
#include <ncurses.h> /* ncurses.h includes stdio.h */ 
#include <string.h> 
int main()
{char mesg[]="Enter a string: "; char str[80];int row,col; initscr(); getmaxyx(stdscr,row,col);mvprintw(row/2,(col−strlen(mesg))/2,"%s",mesg);getstr(str);// 获取字符串mvprintw(LINES − 2, 0, "You Entered: %s", str);getch();endwin();return 0;
}

6. 属性

6.1 属性使用例子

getyx()获取游标当前位置
move移动游标

读取.c文件,加粗注释。

#include <ncurses.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ int ch, prev, row, col;prev = EOF;FILE *fp;int y, x;if(argc != 2){printf("Usage: %s <a c file name>\n", argv[0]);exit(1);}fp = fopen(argv[1], "r");if(fp == NULL){perror("Cannot open input file");exit(1);}initscr(); getmaxyx(stdscr, row, col); while((ch = fgetc(fp)) != EOF) {getyx(stdscr, y, x); if(y == (row − 1)) {printw("<−Press Any Key−>"); getch();clear(); /*清屏*/move(0, 0); /*回到开头*/}if(prev == '/' && ch == '*') /*确定注释开始*/ {attron(A_BOLD); /* 加粗 */getyx(stdscr, y, x); /* 获取当前位置 */move(y, x − 1); /* 回退*/printw("%c%c", '/', ch); /* 输出 */}elseprintw("%c", ch);refresh();if(prev == '*' && ch == '/')attroff(A_BOLD); /* 关闭加粗选项*/prev = ch;}
endwin();fclose(fp);return 0;
}
6.2 属性值

在头文件里面, 使用
attron(A_REVERSE | A_BOLD)

#define WA_ATTRIBUTES	A_ATTRIBUTES
#define WA_NORMAL	A_NORMAL
#define WA_STANDOUT	A_STANDOUT
#define WA_UNDERLINE	A_UNDERLINE
#define WA_REVERSE	A_REVERSE
#define WA_BLINK	A_BLINK
#define WA_DIM		A_DIM
#define WA_BOLD		A_BOLD
#define WA_ALTCHARSET	A_ALTCHARSET
#define WA_INVIS	A_INVIS
#define WA_PROTECT	A_PROTECT
#define WA_HORIZONTAL	A_HORIZONTAL
#define WA_LEFT		A_LEFT
#define WA_LOW		A_LOW
#define WA_RIGHT	A_RIGHT
#define WA_TOP		A_TOP
#define WA_VERTICAL	A_VERTICAL
6.3 attrset() 与 attron()区别

attrset()删了重来
attron()只影响它自己指定的。

6.4 attrget()

获取属性

6.5 attr_系列函数

与前面函数一样,只是需要传入attr_t类型参数。还有扩展的wattr系函数。

6.6 chgat()函数

在不移动游标的情况下,设置一组字符的属性值。

chgat(1, A_REVERSE, 0, NULL);
// 第一个参数,几个字符
// 第二个参数,属性值
// 第三个参数,颜色值
// 第四个参数,一直为NULL

使用样例

#include <ncurses.h>
int main(int argc, char *argv[])
{ initscr(); start_color(); init_pair(1, COLOR_CYAN, COLOR_BLACK);printw("A Big string which i didn't care to type fully ");mvchgat(0, 0,1, A_BLINK, 1, NULL); refresh();getch();endwin(); /* End curses mode */return 0;
}

7. 窗口

ncurse中的一个重要概念,之前的大多数操作大多是在stdscr上进行的。

7.1 窗口相关函数
newwin()
delwin()
box(win, ch1, ch2)
// ch1 ch2 分别是边界上水平和垂直的字符
border(ls, rs, ts, bs, tl, tr, bl, br)
mvvline(y,x,ch1, num)
// 生成竖线
mvhline(y,x,ch2, num)
// 生成横线
// l: left s: side
7.2 使用样例1
#include <ncurses.h>
WINDOW *create_newwin(int height, int width, int starty, int startx);
void destroy_win(WINDOW *local_win);
int main(int argc, char *argv[])
{ WINDOW *my_win;int startx, starty, width, height;int ch;initscr(); cbreak(); keypad(stdscr, TRUE); // 按F1需要height = 3;width = 10;starty = (LINES − height) / 2; startx = (COLS − width) / 2; printw("Press F1 to exit");refresh();my_win = create_newwin(height, width, starty, startx);while((ch = getch()) != KEY_F(1)){ switch(ch){ case KEY_LEFT:destroy_win(my_win);my_win = create_newwin(height, width, starty,−−startx);break;case KEY_RIGHT:destroy_win(my_win);my_win = create_newwin(height, width, starty,++startx);break;case KEY_UP:destroy_win(my_win);my_win = create_newwin(height, width, −−starty,startx);break;case KEY_DOWN:destroy_win(my_win);my_win = create_newwin(height, width, ++starty,startx);break; }}endwin(); /* End curses mode */return 0;
}
WINDOW *create_newwin(int height, int width, int starty, int startx)
{ WINDOW *local_win;local_win = newwin(height, width, starty, startx);box(local_win, 0 , 0); wrefresh(local_win);return local_win;
}
void destroy_win(WINDOW *local_win)
{ wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');wrefresh(local_win);delwin(local_win);
}
7.3 使用样例2
#include <ncurses.h>
typedef struct _win_border_struct {chtype ls, rs, ts, bs, tl, tr, bl, br;
}WIN_BORDER;
typedef struct _WIN_struct {int startx, starty;int height, width;WIN_BORDER border;
}WIN;
void init_win_params(WIN *p_win);
void print_win_params(WIN *p_win);
void create_box(WIN *win, bool flag);
int main(int argc, char *argv[])
{ WIN win;int ch;initscr(); /* Start curses mode */start_color(); /* Start the color functionality */cbreak(); /* Line buffering disabled, Pass on* everty thing to me */keypad(stdscr, TRUE); /* I need that nifty F1 */noecho();init_pair(1, COLOR_CYAN, COLOR_BLACK);init_win_params(&win);print_win_params(&win);attron(COLOR_PAIR(1));printw("Press F1 to exit");refresh();attroff(COLOR_PAIR(1));create_box(&win, TRUE);while((ch = getch()) != KEY_F(1)){ switch(ch){ case KEY_LEFT:create_box(&win, FALSE);−−win.startx;create_box(&win, TRUE);break;case KEY_RIGHT:create_box(&win, FALSE);++win.startx;create_box(&win, TRUE);break;case KEY_UP:create_box(&win, FALSE);−−win.starty;create_box(&win, TRUE);break;case KEY_DOWN:create_box(&win, FALSE);++win.starty;create_box(&win, TRUE);break; }}endwin(); return 0;
}
void init_win_params(WIN *p_win)
{p_win−>height = 3;p_win−>width = 10;p_win−>starty = (LINES − p_win−>height)/2; p_win−>startx = (COLS − p_win−>width)/2;p_win−>border.ls = '|';p_win−>border.rs = '|';p_win−>border.ts = '−';p_win−>border.bs = '−';p_win−>border.tl = '+';p_win−>border.tr = '+';p_win−>border.bl = '+';p_win−>border.br = '+';
}
void print_win_params(WIN *p_win)
{
#ifdef _DEBUGmvprintw(25, 0, "%d %d %d %d", p_win−>startx, p_win−>starty, p_win−>width, p_win−>height);refresh();
#endif
}
void create_box(WIN *p_win, bool flag)
{ int i, j;int x, y, w, h;x = p_win−>startx;y = p_win−>starty;w = p_win−>width;h = p_win−>height;if(flag == TRUE){ mvaddch(y, x, p_win−>border.tl);mvaddch(y, x + w, p_win−>border.tr);mvaddch(y + h, x, p_win−>border.bl);mvaddch(y + h, x + w, p_win−>border.br);mvhline(y, x + 1, p_win−>border.ts, w − 1);mvhline(y + h, x + 1, p_win−>border.bs, w − 1);mvvline(y + 1, x, p_win−>border.ls, h − 1);mvvline(y + 1, x + w, p_win−>border.rs, h − 1);}elsefor(j = y; j <= y + h; ++j)for(i = x; i <= x + w; ++i)mvaddch(j, i, ' ');refresh();
}

8. 颜色

has_colors()来测试是否有颜色,start_color()在使用颜色之前需要进行调用。
init_color()初始化颜色。

8.1 代码示例
#include <ncurses.h>
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string);
int main(int argc, char *argv[])
{ initscr();if(has_colors() == FALSE){ endwin();printf("Your terminal does not support color\n");exit(1);}start_color(); init_pair(1, COLOR_RED, COLOR_BLACK);attron(COLOR_PAIR(1));print_in_middle(stdscr, LINES / 2, 0, 0, "Viola !!! In color ...");attroff(COLOR_PAIR(1));getch();endwin();
}
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
{ int length, x, y;float temp;if(win == NULL)win = stdscr;getyx(win, y, x);if(startx != 0)x = startx;if(starty != 0)y = starty;if(width == 0)width = 80;length = strlen(string);temp = (width − length)/ 2;x = startx + (int)temp;mvwprintw(win, y, x, "%s", string);refresh();
}
8.2 颜色宏定义
#define COLOR_BLACK	0
#define COLOR_RED	1
#define COLOR_GREEN	2
#define COLOR_YELLOW	3
#define COLOR_BLUE	4
#define COLOR_MAGENTA	5
#define COLOR_CYAN	6
#define COLOR_WHITE	7
8.3 改变颜色定义

init_color(COLOR_RED, 0, 0, 400)
后面跟的是颜色的rgb的值。

8.4 颜色内容

color_content()pair_content()可以获取颜色内容,前景、背景对。

8.5 chgat()函数

不移动游标的情况下,改变一组字符的颜色。
chgat(−1, A_REVERSE, 0, NULL)

使用例子

#include <ncurses.h>
int main(int argc, char *argv[])
{ 
initscr(); start_color(); init_pair(1, COLOR_CYAN, COLOR_BLACK);printw("A Big string which i didn't care to type fully ");mvchgat(0, 0,1, A_BLINK, 1, NULL); refresh();getch();endwin(); /* End curses mode */return 0;
}

9. 键盘交互

9.1 基本用法

接受键盘的信号还是通过输入字符的判断来实现的。

int ch;
ch = getch();if (ch == KEY_F1)...// 应用逻辑
9.2 使用范例
#include <stdio.h>
#include <ncurses.h>#define WIDTH 30
#define HEIGHT 10 int startx = 0;
int starty = 0;char *choices[] = { "Choice 1","Choice 2","Choice 3","Choice 4","Exit",};
int n_choices = sizeof(choices) / sizeof(char *);
void print_menu(WINDOW *menu_win, int highlight);int main()
{	WINDOW *menu_win;int highlight = 1;int choice = 0;int c;initscr();clear();noecho();cbreak();	/* Line buffering disabled. pass on everything */startx = (80 - WIDTH) / 2;starty = (24 - HEIGHT) / 2;menu_win = newwin(HEIGHT, WIDTH, starty, startx);keypad(menu_win, TRUE);mvprintw(0, 0, "Use arrow keys to go up and down, Press enter to select a choice");refresh();print_menu(menu_win, highlight);while(1){	c = wgetch(menu_win);switch(c){	case KEY_UP:if(highlight == 1)highlight = n_choices;else--highlight;break;case KEY_DOWN:if(highlight == n_choices)highlight = 1;else ++highlight;break;case 10:choice = highlight;break;default:mvprintw(24, 0, "Charcter pressed is = %3d Hopefully it can be printed as '%c'", c, c);refresh();break;}print_menu(menu_win, highlight);if(choice != 0)	/* User did a choice come out of the infinite loop */break;}	mvprintw(23, 0, "You chose choice %d with choice string %s\n", choice, choices[choice - 1]);clrtoeol();refresh();endwin();return 0;
}void print_menu(WINDOW *menu_win, int highlight)
{int x, y, i;	x = 2;y = 2;box(menu_win, 0, 0);for(i = 0; i < n_choices; ++i){	if(highlight == i + 1) /* High light the present choice */{	wattron(menu_win, A_REVERSE); mvwprintw(menu_win, y, x, "%s", choices[i]);wattroff(menu_win, A_REVERSE);}elsemvwprintw(menu_win, y, x, "%s", choices[i]);++y;}wrefresh(menu_win);
}

10. 与鼠标交互

10.1 基本介绍

需要用函数mousemask( mmask_t newmask, mmask_t *oldmask)来开启监听鼠标的事件。

鼠标事件

 	   BUTTON1_PRESSED          mouse button 1 downBUTTON1_RELEASED         mouse button 1 upBUTTON1_CLICKED          mouse button 1 clickedBUTTON1_DOUBLE_CLICKED   mouse button 1 double clickedBUTTON1_TRIPLE_CLICKED   mouse button 1 triple clickedBUTTON2_PRESSED          mouse button 2 downBUTTON2_RELEASED         mouse button 2 upBUTTON2_CLICKED          mouse button 2 clickedBUTTON2_DOUBLE_CLICKED   mouse button 2 double clickedBUTTON2_TRIPLE_CLICKED   mouse button 2 triple clickedBUTTON3_PRESSED          mouse button 3 downBUTTON3_RELEASED         mouse button 3 upBUTTON3_CLICKED          mouse button 3 clickedBUTTON3_DOUBLE_CLICKED   mouse button 3 double clickedBUTTON3_TRIPLE_CLICKED   mouse button 3 triple clickedBUTTON4_PRESSED          mouse button 4 downBUTTON4_RELEASED         mouse button 4 upBUTTON4_CLICKED          mouse button 4 clickedBUTTON4_DOUBLE_CLICKED   mouse button 4 double clickedBUTTON4_TRIPLE_CLICKED   mouse button 4 triple clickedBUTTON_SHIFT             shift was down during button state changeBUTTON_CTRL              control was down during button state changeBUTTON_ALT               alt was down during button state changeALL_MOUSE_EVENTS         report all button state changesREPORT_MOUSE_POSITION    report mouse movement
10.2 监听鼠标事件

通过getMouse(MEVENT *) 来获取鼠标事件的状态。

事件的结构体

 typedef struct{short id;         /* ID to distinguish multiple devices */int x, y, z;      /* event coordinates */mmask_t bstate;   /* button state bits */}   

判断事件发生

 MEVENT event;ch = getch();if(ch == KEY_MOUSE)if(getmouse(&event) == OK).    /* Do some thing with the event */..if(event.bstate & BUTTON1_PRESSED)printw("Left Button Pressed");
10.3 使用实例
#include <ncurses.h>#define WIDTH 30
#define HEIGHT 10 int startx = 0;
int starty = 0;char *choices[] = { 	"Choice 1","Choice 2","Choice 3","Choice 4","Exit",};int n_choices = sizeof(choices) / sizeof(char *);void print_menu(WINDOW *menu_win, int highlight);
void report_choice(int mouse_x, int mouse_y, int *p_choice);int main()
{	int c, choice = 0;WINDOW *menu_win;MEVENT event;/* Initialize curses */initscr();clear();noecho();cbreak();	//Line buffering disabled. pass on everything/* Try to put the window in the middle of screen */startx = (80 - WIDTH) / 2;starty = (24 - HEIGHT) / 2;attron(A_REVERSE);mvprintw(23, 1, "Click on Exit to quit (Works best in a virtual console)");refresh();attroff(A_REVERSE);/* Print the menu for the first time */menu_win = newwin(HEIGHT, WIDTH, starty, startx);print_menu(menu_win, 1);/* Get all the mouse events */mousemask(ALL_MOUSE_EVENTS, NULL);while(1){	c = wgetch(menu_win);switch(c){	case KEY_MOUSE:if(getmouse(&event) == OK){	/* When the user clicks left mouse button */if(event.bstate & BUTTON1_PRESSED){	report_choice(event.x + 1, event.y + 1, &choice);if(choice == -1) //Exit chosengoto end;mvprintw(22, 1, "Choice made is : %d String Chosen is \"%10s\"", choice, choices[choice - 1]);refresh(); }}print_menu(menu_win, choice);break;}}		
end:endwin();return 0;
}void print_menu(WINDOW *menu_win, int highlight)
{int x, y, i;	x = 2;y = 2;box(menu_win, 0, 0);for(i = 0; i < n_choices; ++i){	if(highlight == i + 1){	wattron(menu_win, A_REVERSE); mvwprintw(menu_win, y, x, "%s", choices[i]);wattroff(menu_win, A_REVERSE);}elsemvwprintw(menu_win, y, x, "%s", choices[i]);++y;}wrefresh(menu_win);
}/* Report the choice according to mouse position */
void report_choice(int mouse_x, int mouse_y, int *p_choice)
{	int i,j, choice;i = startx + 2;j = starty + 3;for(choice = 0; choice < n_choices; ++choice)if(mouse_y == j + choice && mouse_x >= i && mouse_x <= i + strlen(choices[choice])){	if(choice == n_choices - 1)*p_choice = -1;		else*p_choice = choice + 1;	break;}
}

11. 屏幕操作

11.1 getyx(win, y,x )

取得游标此时的坐标

11.2 scr_dump()

保存屏幕信息

11.3 窗口保存

putwin()保存窗口信息到文件
getwin()
copywin()

12. 杂项

12.1 cur_set()

游标可见性设置

0 : invisible      or
1 : normal    or
2 : very visible.
12.2 暂时离开curse模式

#include <ncurses.h>int main()
{	initscr();			/* Start curses mode 		  */printw("Hello World !!!\n");	/* Print Hello World		  */refresh();			/* Print it on to the real screen */def_prog_mode();		/* Save the tty modes		  */endwin();			/* End curses mode temporarily	  */system("/bin/sh");		/* Do whatever you like in cooked mode */reset_prog_mode();		/* Return to the previous tty mode*//* stored by def_prog_mode() 	  */refresh();			/* Do refresh() to restore the	  *//* Screen contents		  */printw("Another String\n");	/* Back to curses use the full    */refresh();			/* capabilities of curses	  */endwin();			/* End curses mode		  */return 0;
}
12.3 ACS_标量

#include <ncurses.h>int main()
{initscr();printw("Upper left corner           "); addch(ACS_ULCORNER); printw("\n"); printw("Lower left corner           "); addch(ACS_LLCORNER); printw("\n");printw("Lower right corner          "); addch(ACS_LRCORNER); printw("\n");printw("Tee pointing right          "); addch(ACS_LTEE); printw("\n");printw("Tee pointing left           "); addch(ACS_RTEE); printw("\n");printw("Tee pointing up             "); addch(ACS_BTEE); printw("\n");printw("Tee pointing down           "); addch(ACS_TTEE); printw("\n");printw("Horizontal line             "); addch(ACS_HLINE); printw("\n");printw("Vertical line               "); addch(ACS_VLINE); printw("\n");printw("Large Plus or cross over    "); addch(ACS_PLUS); printw("\n");printw("Scan Line 1                 "); addch(ACS_S1); printw("\n");printw("Scan Line 3                 "); addch(ACS_S3); printw("\n");printw("Scan Line 7                 "); addch(ACS_S7); printw("\n");printw("Scan Line 9                 "); addch(ACS_S9); printw("\n");printw("Diamond                     "); addch(ACS_DIAMOND); printw("\n");printw("Checker board (stipple)     "); addch(ACS_CKBOARD); printw("\n");printw("Degree Symbol               "); addch(ACS_DEGREE); printw("\n");printw("Plus/Minus Symbol           "); addch(ACS_PLMINUS); printw("\n");printw("Bullet                      "); addch(ACS_BULLET); printw("\n");printw("Arrow Pointing Left         "); addch(ACS_LARROW); printw("\n");printw("Arrow Pointing Right        "); addch(ACS_RARROW); printw("\n");printw("Arrow Pointing Down         "); addch(ACS_DARROW); printw("\n");printw("Arrow Pointing Up           "); addch(ACS_UARROW); printw("\n");printw("Board of squares            "); addch(ACS_BOARD); printw("\n");printw("Lantern Symbol              "); addch(ACS_LANTERN); printw("\n");printw("Solid Square Block          "); addch(ACS_BLOCK); printw("\n");printw("Less/Equal sign             "); addch(ACS_LEQUAL); printw("\n");printw("Greater/Equal sign          "); addch(ACS_GEQUAL); printw("\n");printw("Pi                          "); addch(ACS_PI); printw("\n");printw("Not equal                   "); addch(ACS_NEQUAL); printw("\n");printw("UK pound sign               "); addch(ACS_STERLING); printw("\n");refresh();getch();endwin();return 0;
}

Ref

linux-ho-to

相关文章:

ncurse编程指南

文章目录 0. 介绍1. Hello, Ncurse2. 初始化函数2.1 raw() 和 cbreak()2.2 echo()和noecho()2.3 keypad()2.4 halfdelay()2.5 初始化样例 3. 命名规范4. 输出函数4.1 addch()类函数4.2 printw()类函数4.3 addstr()类函数4.4 注意4.5 输出函数例子 5. 输入函数5.1 getch()5.2 sc…...

Graph U-Net Code【图分类】

1. main.py # GNet是需要用到的model net GNet(G_data.feat_dim, G_data.num_class, args) # graph, 特征维度&#xff0c;类别数&#xff0c;参数 trainer Trainer(args, net, G_data) #开始训练数据 # 正式开始训练数据 trainer.train()2. network.py class GNet(nn.Modul…...

PTA 秀恩爱分得快(树)

题目 古人云&#xff1a;秀恩爱&#xff0c;分得快。 互联网上每天都有大量人发布大量照片&#xff0c;我们通过分析这些照片&#xff0c;可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人&#xff0c;这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在…...

文心一言4.0对比ChatGPT4.0有什么优势?

目录 总结 文心一言4.0的优势 文心一言4.0的劣势 免费分享使用工具 后话 生成式AI的困境 “不会问”“不会用”“不敢信” 为什么要出收费版本&#xff1f; 目前使用过国内的文心一言3.5和WPS AI&#xff0c;国外的ChatGPT4.0。 文心一言和其他国内产品相比&#xff0…...

美观且可以很方便自定义的MATLAB绘图颜色

函数介绍 主函数是draw_test&#xff0c;用于测试函数。 draw_h是函数&#xff0c;用于给Matlab提供美观且可以很方便自定义的绘图颜色。 draw_h函数介绍 这是一个带输入输出的函数&#xff0c;输入1/2/3&#xff0c;输出下面三种颜色库的配色&#xff0c;每种库均有五种颜色…...

基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…...

陪诊系统|挂号陪护搭建二开陪诊师入驻就医小程序

我们的陪诊小程序拥有丰富多样的功能&#xff0c;旨在最大程度满足现代人的需求。首先&#xff0c;我们采用了智能排队系统&#xff0c;通过扫描二维码获取排号信息&#xff0c;让您从繁琐的排队过程中解放出来。其次&#xff0c;我们提供了多种支付方式&#xff0c;不仅可以实…...

恒驰服务 | 华为云数据使能专家服务offering之大数据建设

恒驰大数据服务主要针对客户在进行智能数据迁移的过程中&#xff0c;存在业务停机、数据丢失、迁移周期紧张、运维成本高等问题&#xff0c;通过为客户提供迁移调研、方案设计、迁移实施、迁移验收等服务内容&#xff0c;支撑客户实现快速稳定上云&#xff0c;有效降低时间成本…...

轻量级狂雨小说cms系统源码 v1.5.2 基于ThinkPHP5.1+MySQL

轻量级狂雨小说cms系统源码 v1.5.2 基于ThinkPHP5.1MySQL的技术开发 狂雨小说cms提供一个轻量级小说网站解决方案&#xff0c;基于ThinkPHP5.1MySQL的技术开发。 KYXSCMS,灵活&#xff0c;方便&#xff0c;人性化设计简单易用是最大的特色&#xff0c;是快速架设小说类网站首选…...

Leetcode刷题详解——Pow(x, n)

1. 题目链接&#xff1a;50. Pow(x, n) 2. 题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a;…...

计算机毕业设计选题推荐-校园失物招领微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

人工智能基础_机器学习011_梯度下降概念_梯度下降步骤_函数与导函数求解最优解---人工智能工作笔记0051

然后我们来看一下梯度下降,这里先看一个叫 无约束最优化问题,,值得是从一个问题的所有可能的备选方案中选最优的方案, 我们的知道,我们的正态分布这里,正规的一个正态分布,还有我们的正规方程,他的这个x,是正规的,比如上面画的这个曲线,他的这个x,就是大于0的对吧,而现实生活…...

开放式耳机能保护听力吗,开放式耳机跟骨传导耳机哪个更好?

如果从严格意义上来讲的话&#xff0c;开放式耳机中的骨传导耳机是能保护听力&#xff0c;现如今的开放式耳机是一个统称&#xff0c;将所有不入耳的类目全部规划到一块。因此在开放式耳机中存在着一些耳机是只能够保持周边环境音&#xff0c;而不是保护听力的。 下面让我来给…...

【Qt之QLocale】使用

描述 QLocale类可以在多种语言之间进行数字和字符串的转换。 QLocale类在构造函数中使用语言/国家对进行初始化&#xff0c;并提供类似于QString中的数字转字符串和字符串转数字的转换函数。 示例&#xff1a; QLocale egyptian(QLocale::Arabic, QLocale::Egypt);QString s1 …...

维修服务预约小程序的效果如何

生活服务中维修项目绝对是需求量很高的&#xff0c;如常见的保洁、管道疏通、数码维修、安装、便民服务等&#xff0c;可以说每天都有生意&#xff0c;而对相关维修店企业来说&#xff0c;如何获得更多生意很重要。 接下来让我们看看通过【雨科】平台制作维修服务预约小程序能…...

前端架构体系调研整理汇总

1.公司研发人数与前端体系 小型创业公司 前端人数&#xff1a; < 3 人 产品类型&#xff1a; 产品不是非常成熟&#xff0c;比较新颖。 项目流程&#xff1a;不完善&#xff0c;快、紧促&#xff0c;没有固定的时间排期。 技术栈&#xff1a; 没有历史包袱&#xff0c;技…...

DrawerLayout的点击事件会穿透到底部,如何拦截?

DrawerLayout实现侧后&#xff0c;发现了一个问题。点击DrawerLayout的画面&#xff0c;会触发覆盖的底层页面的控件。由此说明点击事件穿透到了底部。但是我只需要触发抽屉布局里的控件&#xff0c;不想触发底层被覆盖的看不见的按钮&#xff0c;由此我想到的时让抽屉页面拦截…...

在Spring boot中 使用JWT和过滤器实现登录认证

在Spring boot中 使用JWT和过滤器实现登录认证 一、登录获得JWT 在navicat中运行如下sql,准备一张user表 -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id int(11) …...

天堂2如何对版本里面的内容进行修改

天堂2写装备属性的问题 早一点的版本属性都是写在armor文件夹 xml档里&#xff0c;不再写armor里了 armor文件夹里只有防御 HP MP增加量&#xff0c;套装的属性都用一个技能形式写在 skills里了 在配合数据库里一个叫armorsets实现套装属性&#xff0c;拿皇家套做说明。 id 43…...

代码随想录Day33 LeetCode T62不同路径 LeetCode T63 不同路径II

前言 动规五部曲 1.确定dp数组含义 2.确定递推公式 3.初始化数组 4.确定遍历方式 5.打印dp数组查看分析问题 LeetCode T62 不同路径 题目链接:62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 注:n行m列而不是m行n列 1.确定dp数组含义 代表到达此下标有多少条…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...