📄 mclient.cpp
字号:
#include"\sunshine\include\mclient.h"
#include<string.h>
#include<alloc.h>
#define DELTA 10
MClient::MClient(int x,int y,int w,int h,char *idname)
: MObj(x,y,w,h,idname)
{
window=new MWindow*[DELTA];
windownum=0;
maxwindow=DELTA;
}
MClient::~MClient()
{
for(int i=0;i<windownum;i++)
delete window[i];
delete window;
}
void MClient::Add(MWindow &awin)
{
int i;
windownum++;
if(windownum>1)
window[0]->SetAc(0);
if(windownum>maxwindow)
{
maxwindow+=DELTA;
window=(MWindow**)realloc(window,maxwindow);
}
if(windownum>1)
for(i=maxwindow-2;i>=0;i--) window[i+1]=window[i];
window[0]=&awin;
window[0]->SetAc(1);
}
void MClient::Del()
{
delete window[0];
for(int i=0;i<maxwindow-1;i++)
window[i]=window[i+1];
window[0]->SetAc(1);
windownum--;
}
int MClient::IsInAny(MWindow *p)
{
int x1=p->x(),y1=p->y();
int x2=p->x()+p->w()-1;
int y2=p->y()+p->h()-1;
int xx1,yy1,xx2,yy2;
int i,j;
char *name=p->GetId();
for(i=0;i<windownum;i++)
{
if(!strcmp(window[i]->GetId(),name))
continue;
xx1=window[i]->x();
yy1=window[i]->y();
xx2=window[i]->x()+window[i]->w()-1;
yy2=window[i]->y()+window[i]->h()-1;
for(j=x1;j<=x2;j++)
if(j>=xx1&&y1>=yy1&&j<=xx2&&y1<=yy2) return 1;
for(j=y1;j<=y2;j++)
if(x2>=xx1&&j>=yy1&&x2<=xx2&&j<=yy2) return 1;
for(j=x1;j<=x2;j++)
if(j>=xx1&&y2>=yy1&&j<=xx2&&y2<=yy2) return 1;
for(j=y1;j<=y2;j++)
if(x1>=xx1&&j>=yy1&&x1<=xx2&&j<=yy2) return 1;
}
return 0;
}
void MClient::ToHead(int i)
{
int j;
MWindow *temp;
if(i==0||i>=windownum) return;
temp=window[i];
for(j=i-1;j>=0;j--) window[j+1]=window[j];
window[0]=temp;
}
int MClient::Process()
{
Mouse am;
int value,i,j;
if(!windownum) return 1;
if(firstrun)
{
firstrun=0;
for(i=windownum;i>0;i--)
window[i-1]->Process();
}
if(am.lp())
{
for(int i=0;i<windownum;i++)
{
MWindow &awin=*(window[i]);
if(am.x()>=awin.x()&&am.y()>=awin.y()&&
am.x()<=awin.x()+awin.w()-1&&am.y()<=
awin.y()+awin.h()-1) break;
}
if(i>0&&i<windownum)
{
if(!IsInAny(window[i]))
{
window[0]->SetAc(0);
window[0]->LightTopic();
ToHead(i);
window[0]->SetAc(1);
window[0]->LightTopic();
return 1;
} //end when no in any window's rectangle
for(j=0;j<=i;j++) window[j]->Restore();
window[0]->SetAc(0);
ToHead(i);
window[0]->SetAc(1);
for(j=i;j>=0;j--)
{
window[j]->Save();
window[j]->Redraw();
}
return 1;
}//end if else
}//end if
for(i=0;i<windownum;i++)
{
value=window[i]->Process();
switch(value)
{
case DEL: Del();
if(!windownum) return 1;
window[0]->Redraw();
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -