📄 mywindow.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 + -