📄 q_window.cpp
字号:
#include "qcurses/Q_Window.hpp"/*# 最近修改 2004年12月10日 在UNIX里面有这样的问题!不能反复执行 start_color()#最后修改:2004年12月22日修改了 SetCaption 首先画一个框,然后在判断宽度##*/int Q_Window::ColorINT = 1;int Q_Window::ID = 1;/*######################################### 函数功能:析构函数 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/Q_Window::~Q_Window(){ delwin(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:构造函数 ## 函数参数:WINDOW *vMainWin 主窗口 ## int vHigth 高度 ## int vWidth 宽度 ## int vYBegin 起始y ## int vXBegin 起始x ## bool vBox 是否画框 ## int vCFront 文字颜色 ## int vCBack 背景色 #########################################*/Q_Window::Q_Window(WINDOW *vMainWin,int vHigth,int vWidth,int vYBegin,int vXBegin,bool vBox,int vCFront,int vCBack):Q_Event(){ //设定 raw(); //关闭 DEL 按键 noecho(); //没有显示 cbreak(); curs_set(0); //关闭光标 //成员变量赋值 MainWin = vMainWin; BoxFlag = vBox; _beginy = vYBegin; _beginx = vXBegin; //建立子窗口 WorkWin = derwin(vMainWin, vHigth, vWidth, vYBegin, vXBegin); //加入颜色 if (has_colors()) { Color = ColorINT; init_pair(Color,vCFront,vCBack); wbkgd(WorkWin,COLOR_PAIR(Color)); ColorINT++; CFront = vCFront; CBack = vCBack; } //画框 if (BoxFlag) { RealMaxy = vHigth-2; RealMaxx = vWidth-4; RealY = 1; RealX = 2; myBOX(WorkWin,0,0); } else { RealMaxy = vHigth; RealMaxx = vWidth; RealY = 0; RealX = 0; } //完成设定,刷新窗口 wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:是否画框 ## 返 回 值:画框返回true,反之返回false ## 函数参数:NULL #########################################*/bool Q_Window::isBox(){ return BoxFlag;}//------------------------------------------------------------------------------------------/*######################################### 函数功能:设定标题 ## 返 回 值:NULL ## 函数参数:char *Title 设定的标题 ## int vCFront 文字颜色 ## int vCBack 背景色 #########################################*/void Q_Window::SetCaption(char *Title,int vCFront,int vCBack){ int CaptionColor = 0; if (BoxFlag) myBOX(WorkWin,0,0); if (has_colors()) { CaptionColor = ColorINT; init_pair(CaptionColor,vCBack,vCFront); wattron(WorkWin,COLOR_PAIR(CaptionColor)); ColorINT++; } int LEN = strlen(Title); //设定属性 wattron(WorkWin,A_REVERSE); //写入文字 //宽度除以2后不能为基数 int HalfWinMaxx=0; if ((WorkWin->_maxx/2)%2!=0) HalfWinMaxx = WorkWin->_maxx/2 -1; else HalfWinMaxx = WorkWin->_maxx/2; if (LEN%2==0) { if (((LEN/2)%2)==0) mvwprintw(WorkWin,0,HalfWinMaxx-((LEN-1)/2)-3,"[ %s ]",Title); else mvwprintw(WorkWin,0,HalfWinMaxx-(LEN/2)-3,"[ %s ]",Title); } else { if ((((LEN+1)/2)%2)==0) mvwprintw(WorkWin,0,HalfWinMaxx-((LEN-1)/2)-3,"[ %s ] ",Title); else mvwprintw(WorkWin,0,HalfWinMaxx-(LEN/2)-2,"[ %s ] ",Title); } //关闭属性 if (has_colors()) wattroff(WorkWin,COLOR_PAIR(CaptionColor)); wattroff(WorkWin,A_REVERSE); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:刷新窗口 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/void Q_Window::Refresh(){ touchwin(WorkWin); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:取得一个字符 ## 返 回 值:获得的输入 ## 函数参数:NULL #########################################*/int Q_Window::Getch(){ return(wgetch(WorkWin));}//------------------------------------------------------------------------------------------/*######################################### 函数功能:格式化输出文字 ## 返 回 值:NULL ## 函数参数:int y 纵坐标 ## int x 横坐标 ## char *format 格式化字符串 #########################################*/void Q_Window::Mvprint(int y,int x,char *format,...){ mvwprintw(WorkWin,y,x,format); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:移动窗口到X,Y坐标 ## 返 回 值:成功移动 OK,没有移动 ERR ## 函数参数:int y 纵坐标 ## int x 横坐标 #########################################*/int Q_Window::Move(int y,int x){ mvwin(WorkWin,y,x); _beginy = y; _beginx = x; wrefresh(WorkWin); wrefresh(MainWin); return 0;}//------------------------------------------------------------------------------------------/*######################################### 函数功能:清空窗口 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/void Q_Window::Clear(){ for (int i=0;i<RealMaxy;i++) for (int j=0;j<RealMaxx;j++) mvwprintw(WorkWin,i+RealY,j+RealX," "); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:在 vY,vX 开始划 vLong 长横线 ## 返 回 值:NULL ## 函数参数:int vY y坐标 ## int vX x坐标 ## int vLong 长度 #########################################*/void Q_Window::xLine(int vY,int vX,int vLong){ int x,y; getyx(WorkWin,x,y); wmove(WorkWin,vX,vY); whline(WorkWin,ACS_HLINE,vLong); wmove(WorkWin,x,y); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:在 vY,vX 开始划 vLong 长竖线 ## 返 回 值:NULL ## 函数参数:int vY y坐标 ## int vX x坐标 ## int vLong 长度 #########################################*/void Q_Window::yLine(int vY,int vX,int vLong){ int x,y; getyx(WorkWin,x,y); wmove(WorkWin,vX,vY); wvline(WorkWin,ACS_VLINE,vLong); wmove(WorkWin,x,y); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:在vY行上划一条贯彻窗口的横线 ## 返 回 值:NULL ## 函数参数:int vY y坐标 #########################################*/void Q_Window::xBorder(int vY){ int x,y; getyx(WorkWin,x,y); //开始画线 for (int i=0;i<RealMaxx;i++) mvwprintw(WorkWin,vY,i*2,"─"); if (BoxFlag) { mvwaddstr(WorkWin, vY, 0,"├"); //左制表符 mvwaddstr(WorkWin, vY, WorkWin->_maxx-2, "┤"); //右制表符 } wrefresh(WorkWin); wmove(WorkWin,x,y);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:在vX行上划一条贯彻窗口的竖线 ## 返 回 值:NULL ## 函数参数:int vX x坐标 #########################################*/void Q_Window::yBorder(int vX){ int x,y; getyx(WorkWin,x,y); //开始画线 for (int i=0;i<RealMaxy+1;i++) mvwprintw(WorkWin,i,vX,"│"); if (BoxFlag) { mvwaddstr(WorkWin, 0, vX, "┬"); //上制表符 mvwaddstr(WorkWin, WorkWin->_maxy-1, vX, "┴"); //下制表符 } wrefresh(WorkWin); wmove(WorkWin,x,y);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:自定义画框函数 ## 返 回 值:NULL ## 函数参数:int startx x起点 ## int starty y起点 #########################################*/void Q_Window::myBOX(WINDOW *win,int startx,int starty){ int X=0; int Y=0; int i=0; int LEN=0; //设定填充横线数量 char *Across = {"─"}; //用来建立临时的画表格线(横线) char *Erect = {"│"}; //用来建立临时的画表格线(竖线) char *Upleft = {"┌"}; //用来建立临时的画表格线(上左破折) char *Upright = {"┐"}; //用来建立临时的画表格线(上左破折) char *Downleft = {"└"}; //用来建立临时的画表格线(下左破折) char *Downright = {"┘"}; //用来建立临时的画表格线(下右破折)// char *Upleft = {"╭"}; //用来建立临时的画表格线(上左破折)// char *Upright = {"╮"}; //用来建立临时的画表格线(上左破折)// char *Downleft = {"╰"}; //用来建立临时的画表格线(下左破折)// char *Downright = {"╯"}; //用来建立临时的画表格线(下右破折) LEN = win->_maxx/2-1; //去掉两边的横线 //打印上方的表格线 for(i=0;i<LEN;i++) mvwprintw(win,0,i*2,"%s",Across); mvwprintw(win,0,0,"%s",Upleft); mvwprintw(win,0,win->_maxx-2,"%s",Upright); //打印中间的竖线 for(i=1;i<(win->_maxy-1);i++) { mvwprintw(win,i,0,"%s",Erect); mvwprintw(win,i,win->_maxx-2,"%s",Erect); } //打印下方的竖线 for(i=0;i<LEN;i++) mvwprintw(win,win->_maxy-1,i*2,"%s",Across); mvwprintw(win,win->_maxy-1,0,"%s",Downleft); mvwprintw(win,win->_maxy-1,win->_maxx-2,"%s",Downright); wrefresh(win);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -