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数组含义 代表到达此下标有多少条…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
