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数组含义 代表到达此下标有多少条…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...