⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 q_window.cpp

📁 QCurses全部代码 QCurses全部代码
💻 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 + -