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. 命名规范
ncurse
中w
前缀的都是指定窗口,带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)
字符有颜色、加粗等属性。可以通过两种方式添加
- 字符或属性值
addch(ch | A_BOLD | A_UNDERLINE)
- 属性设置函数
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, 特征维度,类别数,参数 trainer Trainer(args, net, G_data) #开始训练数据 # 正式开始训练数据 trainer.train()2. network.py class GNet(nn.Modul…...
PTA 秀恩爱分得快(树)
题目 古人云:秀恩爱,分得快。 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在…...

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

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

基于jsp,ssm物流快递管理系统
开发工具:eclipse,jdk1.8 服务器:tomcat7.0 数据库:mysql5.7 技术: springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分,功能介绍如下: 一、用户(前台)功能: 用…...

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

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

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

Leetcode刷题详解——Pow(x, n)
1. 题目链接:50. Pow(x, n) 2. 题目描述: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2:…...

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

人工智能基础_机器学习011_梯度下降概念_梯度下降步骤_函数与导函数求解最优解---人工智能工作笔记0051
然后我们来看一下梯度下降,这里先看一个叫 无约束最优化问题,,值得是从一个问题的所有可能的备选方案中选最优的方案, 我们的知道,我们的正态分布这里,正规的一个正态分布,还有我们的正规方程,他的这个x,是正规的,比如上面画的这个曲线,他的这个x,就是大于0的对吧,而现实生活…...

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

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

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

前端架构体系调研整理汇总
1.公司研发人数与前端体系 小型创业公司 前端人数: < 3 人 产品类型: 产品不是非常成熟,比较新颖。 项目流程:不完善,快、紧促,没有固定的时间排期。 技术栈: 没有历史包袱,技…...
DrawerLayout的点击事件会穿透到底部,如何拦截?
DrawerLayout实现侧后,发现了一个问题。点击DrawerLayout的画面,会触发覆盖的底层页面的控件。由此说明点击事件穿透到了底部。但是我只需要触发抽屉布局里的控件,不想触发底层被覆盖的看不见的按钮,由此我想到的时让抽屉页面拦截…...

在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档里,不再写armor里了 armor文件夹里只有防御 HP MP增加量,套装的属性都用一个技能形式写在 skills里了 在配合数据库里一个叫armorsets实现套装属性,拿皇家套做说明。 id 43…...

代码随想录Day33 LeetCode T62不同路径 LeetCode T63 不同路径II
前言 动规五部曲 1.确定dp数组含义 2.确定递推公式 3.初始化数组 4.确定遍历方式 5.打印dp数组查看分析问题 LeetCode T62 不同路径 题目链接:62. 不同路径 - 力扣(LeetCode) 题目思路: 注:n行m列而不是m行n列 1.确定dp数组含义 代表到达此下标有多少条…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...