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

📄 mywindow.c

📁 linux环境下结合ncurse库
💻 C
字号:
#include "BaseEnvInit.h"
#include "TextBox.h"
#include "Button.h"
#include "LinkStruct.h"
#include"MyWindow.h"

void ChangeMyWindow(MyWindow **ppmywindow)
{
	MyWindow *ptempwindow=*ppmywindow;
	*ppmywindow=MakeMyWindow(*ppmywindow);
	ptempwindow->DelMyWindow(ptempwindow);
}

void AddActiveElement(MyWindow * pMywindow,void * pdata ,int objecttype,int y,int x)
{
	int mainx,mainy;
	getbegyx(pMywindow->m_window,mainy,mainx);
	if(objecttype==ISBUTTON)
	{
		Button * pButton=NULL;
		pButton=(Button *)(pdata);
		pButton->m_px=mainx+x;
		pButton->m_py=mainy+y;
		ChangeButton(&pButton);
		pdata=pButton;
	}
	else
	{
		mvwin(( (TextBox *)pdata)->m_win,(mainy+y),(mainx+x));
		wclear(((TextBox *)pdata)->m_win);
		wrefresh(((TextBox *)pdata)->m_win);
	}
	(pMywindow->m_link.InsertNode)(&(pMywindow->m_link),pdata,objecttype); // AddActiveElement 加入链表中
}

void DrawHline(MyWindow * pMywindow,int y,int x)
{	
	int maxy,maxx;
	getmaxyx(pMywindow->m_window,maxy,maxx);
	mvwhline(pMywindow->m_window,y,x,ACS_S3,maxx-2);
}

void DrawWords(MyWindow * pMywindow,int y,int x,char * str)
{
	mvwprintw(pMywindow->m_window,y,x,"%s",str);
}

void ShowMyWindow(MyWindow * pMywindow)
{
	NODE * pnode=(pMywindow->m_link.head)->next;
	touchwin(pMywindow->m_window);
	wrefresh(pMywindow->m_window); // 显示主窗口
	while(pnode!=(pMywindow->m_link).head)
	{
		if( (pnode->typeflag)==ISBUTTON)
		{
			( ( (Button *)(pnode->pdata))->ShowButton)( (Button*)(pnode->pdata));
		}
		else
		{
			( ( (TextBox *)(pnode->pdata))->ShowTextBox )((TextBox*)(pnode->pdata));
		}
		pnode=pnode->next;
	}
}

void HideMyWindow(MyWindow * pMywindow)
{
	
}

void DelMyWindow(MyWindow * pMywindow)
{

	NODE * pnode=(pMywindow->m_link.head)->next;
	//wrefresh(pMywindow->m_window); // 显示主窗口
	while(pnode!=(pMywindow->m_link).head)
	{
		if(pnode->typeflag==ISBUTTON)
		{
			FreeButton((Button *)(pnode->pdata));
		}
		else
		{ // ISTEXTbOX
			FreeTextBox((TextBox *)(pnode->pdata));
		}
		pnode=pnode->next;
	}
	( (pMywindow->m_link).DestroyLink)( &(pMywindow->m_link)); // 删除链表,相关TEXT,BUTTON 并没有相关的释放
	if(delwin(pMywindow->m_window)==ERR)
	{
		fprintf(stderr,"Error - in Mywindow DelMyWindow() false . Exit Program.");
		endwin();
		exit(1);
	}
}

MyWindow * MakeMyWindow(MyWindow * pMywindow) // 创建Mywindow对象
{
	MyWindow * p=NULL;
	p=(MyWindow * )malloc(sizeof(MyWindow));
	if(!p)
	{
		return NULL;
	}
	memset(p,0,sizeof(MyWindow));

	if(NULL==pMywindow)
	{
		p->m_py=10;
		p->m_px=10;
		p->m_sizex=10;
		p->m_sizey=10;
		p->m_color=BLACK_WHITE;
		p->m_isborder=TRUE;
	}
	else
	{
		memcpy(p,pMywindow,sizeof(MyWindow));
	}
	LinkInit( &(p->m_link));
	p->m_window=newwin(p->m_sizey,p->m_sizex,p->m_py,p->m_px);
	wbkgd(p->m_window,COLOR_PAIR(p->m_color));

	if(p->m_isborder==TRUE)
	{
		box(p->m_window,0,0);
	}
	p->AddActiveElement=AddActiveElement;
	p->DrawHline=DrawHline;
	p->DrawWords=DrawWords;
	p->ShowMyWindow=ShowMyWindow;
	p->HideMyWindow=HideMyWindow;
	p->DelMyWindow=DelMyWindow;
	p->ChangeMyWindow=ChangeMyWindow;
	p->RunMyWindow=RunMyWindow;
	return p;
}


int RunMyWindow(MyWindow * pMywindow)
{	
	int key;
	//int presskey=0;
	NODE * pcurrnode=pMywindow->m_link.head->next;  // 开始为第一个结点
	if(pcurrnode==pMywindow->m_link.head) // 没有活动元素 任意键返回
	{
		wgetch(pMywindow->m_window);
		return 0;
	}
	do
	{
		if(pcurrnode->typeflag==ISBUTTON)
		{
			key=FocusButton((Button *)(pcurrnode->pdata));
				if(key==10)
				{	
					return ((Button *)(pcurrnode->pdata))->m_buttonid;				
				}
		}else if(pcurrnode->typeflag==ISTEXT)
		{
			key=InputString((TextBox *)(pcurrnode->pdata));
		}
		else
		{

		}
		//////////////////////////////////////////////////
		// 关于什么按妞被按下的判断

		// 对象之间选中跳动
		if(key==10 || key==KEY_DOWN || key==KEY_RIGHT || key==9)
		{
			pcurrnode=pcurrnode->next;
			if(pcurrnode==pMywindow->m_link.head)
			{
				pcurrnode=pcurrnode->next;
			}
		}else if(key==KEY_UP || key==KEY_LEFT)
		{
			pcurrnode=pcurrnode->prior;
			if(pcurrnode==pMywindow->m_link.head)
			{
				pcurrnode=pcurrnode->prior;
			}
			
		}if(key==27)
		{
			return 27;
		}
	}
	while (1);
}
	/*
	Link m_link; // 主窗口用有的 "对象",用链表进行管理
	WINDOW * m_window; // 主窗口指针
	short m_color; // 主窗口背景颜色
	bool m_isborder; // 主窗口是否需要边框
	
	*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -