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

📄 windows.cpp

📁 一个微型操作系统源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	else if(t==floppy)
	{       height=42;
		width=50;
		color=20;
		bar(x,y,50,40,color);
		bar(x+10,y-2,30,15,23);
		color=0;
		bar(x+32,y+1,5,10,color);
		bar(x+7,y+17,36,20,15);
		bar(x+2,y+30,3,5,25);
		bar(x+46,y+30,3,5,25);
		line(x+10,y+20,x+40,y+20,0);
		line(x+10,y+24,x+40,y+24,0);
		line(x+10,y+28,x+40,y+28,0);
		line(x+10,y+32,x+40,y+32,0);
	}
	else if(t==drive)
	{   height=20;
	    width=45;
	    color=8;
	    bar(x+1,y-1,width,height,color);
	    bar(x,y,width,height,color);           //background
	    rectangle(x,y,width,height,19);
	    bar(x+5,y+14,width-10,1,15);    // lines
	    bar(x+5,y+12,width-10,1,15);
	    bar(x+5,y+10,width-10,1,15);
	    bar(x+width/2-2,y+height,5,7,color);
	    bar(x,y+height+8,width+2,5,color);
	    rectangle(x,y+height+8,width+2,5,23);
	    bar(x,y+height+10,width,1,15);
	    bar(x+width/2-6,y+height+7,15,8,color);
	    rectangle(x+width/2-6,y+height+6,15,10,23);
	    height+=16;
       }
	else if(t==bmp)
       {        y+=20;
		height=25;
		width=53;
		int wd=45,ht=20;
		color=15;
		bar(x+5,y-15,wd-15,ht+20,color); // paper
		rectangle(x+5,y-15,wd-15,ht+20,8);
		bar(x+7,y-11,wd-20,ht+12,4);       // frame
		line(x+13,y+18,x+17,y-9,10);    // picture
		line(x+25,y+18,x+20,y-9,10);
		hline(x+13,y+18,wd-34,10);
		fill_par(x,y,wd,ht-5,1,color);   // palette background
		bar(x,y+2,wd-38,ht-15,2);                // palette
		fill_par(x+25,y-20,wd-41,ht+5,1,24);   //brush
		bar(x+9,y+2,wd-40,ht-15,0);           // palette
		bar(x+17,y+2,wd-40,ht-15,6);
		bar(x+24,y+2,wd-40,ht-15,4);
		bar(x+32,y+2,wd-40,ht-15,1);
		bar(x-5,y+8,wd-40,ht-15,5);
		bar(x+2,y+8,wd-40,ht-15,8);
		bar(x+9,y+8,wd-40,ht-15,12);
		bar(x+17,y+8,wd-40,ht-15,43);
		bar(x+25,y+8,wd-40,ht-15,13);
	    //	height+=20;
       }
	else                              //Unknown files
	{	height=30;
		width=40;
		color=47;
		fill_par(x+19,y+10,5,15,1,color);
		fill_par(x+5,y+10,5,15,-1,color);
	}
}

void Icons::List_Draw(int i,char select,char whom)
{   int x=Active_Position[i][0];
	int y=Active_Position[i][1],j;
	char color,fc,*temp;
	type t=Active_Type[i];
	height=10;
	width=15;
	if(t==0)                         // Folders in list
	{       if(select==0) color=43;
		else color=1;
		bar(x,y,width,height,color);
		rectangle(x-1,y+1,width+2,height+2,0);
	}
	else if(t==1)       // Files  in list
	{	if(select==0) color=4;
		else color=1;
		rectangle(x,y,height,width,color);
		hline(x+2,y+5,6,0);
		hline(x+3,y+7,5,0);
		hline(x+4,y+9,4,0);
	}
	else if(t==floppy)
	{       height=14;
		width=20;
		if(select==0) color=20;
		else color=1;
		bar(x,y,width,height,color);
		bar(x+3,y-2,width-6,height-8,23);
		bar(x+2,y+6,width-4,height-8,15);
		hline(x+4,y+8,width-8,0);
		hline(x+4,y+10,width-8,0);
	}
	else if(t==drive)
	{   height=10;
	    width=20;
	    if(select==0) color=7;
	    else color=1;
	    bar(x+1,y-1,width,height,color);
	    bar(x,y,width,height,color);           //background
	    rectangle(x,y,width,height,19);
	    bar(x+3,y+6,width-8,1,15);    // lines
	    bar(x+3,y+4,width-8,1,15);
	    bar(x+3,y+2,width-8,1,15);
	    bar(x+width/2-2,y+height,3,5,color);
	    bar(x,y+height+5,width,3,color);       // bottom rod
	    if(select==0) color=23;
	    else color=1;
	    rectangle(x,y+height+5,width,3,color);
	    bar(x,y+height+6,width-2,1,15);        // white line across rod
	    bar(x+width/2-4,y+height+5,8,4,color);     // bottom block
	    rectangle(x+width/2-4,y+height+4,8,5,23);
	    height+=16;
       }
       else if(t==bmp)
       {        y+=10;
		x-=5;
		height=15;
		width=20;
		int wd=45,ht=20;
		if(!select) color=15;
		else color=1;
		bar(x+5,y-5,wd-35,ht-5,color); // paper
		rectangle(x+5,y-5,wd-35,ht-5,8);
		bar(x+6,y-3,wd-38,ht-9,4);        // frame
		fill_par(x+4,y,wd-30,ht-15,1,color);   // palette background
		bar(x+4,y+2,wd-42,ht-18,4);                // palette
		fill_par(x+15,y-8,wd-43,ht-9,1,24);   //brush
		bar(x+8,y+2,wd-43,ht-18,1);
		bar(x+11,y+2,wd-43,ht-18,5);
		y-=6;
	     //	height+=10;
		width-=5;
       }
	else                  //  Unknown files
	{	if(!select)  color=47;
		else color=1;
		fill_par(x+5,y+5,4,7,1,color);
		fill_par(x-2,y+5,4,7,-1,color);
	}
	if(select==0)                // If selected
	{      color=bcolor;
		   fc=fcolor;
	}
	else
	{      color=hbcolor;       // If not yet selected or deselected
		   fc=hfcolor;
	}
	y-=4;

	if(whom==1)
	{   for(j=0;Active_List[i][j]!='\0';j++);
		size=j*8;
		bar(x+width+2,y+height/2,size+2,12,color);
		load_font(3);
		write(x+width+2,y+height/2+2,fc,Active_List[i]);
	}
	else if(whom==2)
	{   bar(x+width+2,y+height/2,width+340,12,color);
		write(x+width+2,y+height/2+2,fc,Active_List[i]);
		x+=150;
		if(Active_Type[i]==file)write(x+width+2,y+height/2+2,fc,"Text File");  // Type
		else if(Active_Type[i]==folder)write(x+width+2+2,y+height/2+2,fc,"Folder");
		else if(Active_Type[i]==unknown)write(x+width+2+2,y+height/2+2,fc,"Unknown");
		x+=150;
		if(Active_Type[i]==file)
		{
			for(i=0;curr_directory[i]!='\0';i++)
			temp[i]=curr_directory[i];
			temp[i] ='\0';
			Dir_Entries *entries;
			Directory dir(temp);
			entries=dir.dir_read();
			long s=entries[i+2].size;
	      /*	for(i=0;curr_directory[i]!='\0';i++)
			temp[i]=curr_directory[i];
		temp[i] ='\0';
		temp[i++]=':';
		for(j=0;j<=11;i++,j++)
		temp[i]=entries[x+2].name[j];
		temp[i] ='\0';
		File f;
		f.file_open(temp,RO);
		s=f.get_file_size();    */
			char *z=To_String(1298);
			for(i=0;z[i]!='\0';i++)
				temp[i]=z[i];
			temp[i] ='\0';
			write(x+width+2,y+height/2+2,fc,temp);
	       }    // Size
	}

}

Tool_Bar taskbar;

class Window
{	public :char *name,fcolor,bcolor,border,view;
		int startx,starty,unwanted;
		Tool_Bar filebar;
		Window(char *);
		void Winini();
		void Draw();
		void Change_Title(char *);
		int Event_Handler();
		void Plot_All(char);
		char Body_Handler(char&,char&,char);
		void Properties(int);
};
void Window ::Winini()
{	fcolor=win.fcolor;
	bcolor=win.bcolor;
}
Window ::Window(char* s)
{	name=s;
	view=0;
	Winini();
	border=7;
}

void Window ::Properties(int index)
{   	int x,y,wd=300,ht=250;
	long i;
	char c1,c2,*temp;
	Icons icon(2);
	x=xmax/2-wd/2;
	y=ymax/2-ht/2;
	Message_Window(x,y,wd,ht,"Properties");
	icon.Icon_Draw(x+30,y+40,index);
	//if (Active_List[index])
	write(x+icon.width+50,y+50,0,Active_List[index]);
	//else write(x+icon.width+50,y+50,0,Active_List[index-1]);
	write(x+15,y+icon.height+80,0,"Type :");
	if(Active_Type[index]==file)write(x+100,y+icon.height+80,0,"Text File");
	else if(Active_Type[index]==folder)write(x+100,y+icon.height+80,0,"Folder");
	else if(Active_Type[index]==bmp)write(x+100,y+icon.height+80,0,"BMP File");
	else if(Active_Type[index]==floppy)write(x+100,y+icon.height+80,0,"3.5 Floppy");
	else if(Active_Type[index]==drive)write(x+100,y+icon.height+80,0,"Disk Drive");
	else if(Active_Type[index]==unknown)write(x+100,y+icon.height+80,0,"Unknown");
	write(x+15,y+icon.height+110,0,"Location :");
	write(x+100,y+icon.height+110,0,curr_directory);
	if(Active_Type[index]==file)
	{	for(i=0;curr_directory[i]!='\0';i++)
			temp[i]=curr_directory[i];
		temp[i] ='\0';
		Dir_Entries *entries;
		Directory dir(temp);
		entries=dir.dir_read();
		long s=entries[i+2].size;
		char *z=To_String(s);
		for(i=0;z[i]!='\0';i++)
			temp[i]=z[i];
		temp[i] ='\0';

		write(x+15,y+icon.height+140,0,"Size :");
		write(x+50,y+icon.height+140,0,temp);
	}
	else if(Active_Type[index]==folder)
	write(x+15,y+icon.height+140,0,"Contains :");
	write(x+15,y+icon.height+170,0,"Created on :");
	while(1)
	{	asm{		mov ax,0h
				int 16h
				mov c1,ah
				mov c2,al
		    }
		if(c1==0x01&&c2==0x1b)    break;
	}
	Plot_All(view);
	if(view==0) icon.Draw(index,1);
	else if(view==1|| view==2) icon.List_Draw(index,1,view);
}
void Window ::Change_Title(char *s)
{       int i,k,j,ht=30,count=0;
	char d1[9]={'F','l','o','p','p','y','\0'},
	     d2[9]={'D','r','i','v','e', ' ','C','\0'},temp[50];
	name=s;
	for(i=0;name[i]!='\0';i++)
		temp[i]=name[i];
	temp[i]='\0';
	if(name[0]!='S')
	{   	// reading into active list
		Dir_Entries *entries;
		Directory dir(temp);
		entries=dir.dir_read();
		char n[4];
		if(entries[0].name[0]=='.')count++;
		if(entries[1].name[0]=='.')count++;
		if(curr_directory[3]==0)count=4;
		for(j=count;j<30;j++ )
		{      //Active_List[j-2]=new(char[8]);
			for(i=0;i<=7&&entries[j].name[i]!=' ';i++)
			Active_List[j-count][i]=entries[j].name[i];
			Active_List[j-count][i]='\0';
			if(Active_List[j-count][0]=='\x0')break;
			for(i=8,k=0;i<=10;i++,k++)
			n[k]=entries[j].name[i];
			n[3]='\0';
			if((n[0]=='T'&&n[1]=='X'&&n[2]=='T')||(n[0]=='t'&&n[1]=='x'&&n[2]=='t')) Active_Type[j-count]=file;//t=file;
			else if((n[0]=='B'&&n[1]=='M'&&n[2]=='P')||(n[0]=='b'&&n[1]=='m'&&n[2]=='p')) Active_Type[j-count]=bmp;
			else if(n[0]==' ')Active_Type[j-count]=folder;//t=folder;
			else Active_Type[j-count]=unknown;//t=unknown;
		}
		if(Active_List[0][0]=='\x0')
		Active_Count=0;
		else
		Active_Count=j-count;
		unwanted=count;
		count=0;
	}
	else
	{   for(i=0;i<9;i++)
		{	Active_List[0][i]=d1[i];
			Active_List[1][i]=d2[i];
		}
		Active_Type[0]=floppy;
		Active_Type[1]=drive;
		Active_Count=2;
	}
	bar(0,0,xmax-1,ht,1);      //titlebar
	load_font(1);
	write(11,11,15,name);      //address
	load_font(3);
}
void Window ::Draw()
{   int curr_x,curr_y,i,k,j,count=0,ht=30,height=14; //currx & y rep icon locations & count rep no of entries;
	Icons icon(1);
	type t;
	Change_Title(name);
	k=0;
	//end of reading to active list
	bar(0,0,xmax-1,5,7); //border of titlebar
	hline(0,2,xmax-1,15);
	hline(0,3,xmax-1,0);
				//position of taskbar
	Active_Position[Active_Count][0]=0;
	Active_Position[Active_Count][1]=winy;
				//position of filebar
	Active_Position[Active_Count+1][0]=5;
	Active_Position[Active_Count+1][1]=ht;
	filebar.Draw_Bar('f');                //filebar
	curr_x=0;
	curr_y=ht+filebar.height+3;
	bar(curr_x,curr_y,xmax-1,winy-curr_y,bcolor);        //body
	bar(curr_x,winy-5,xmax-1,5,7); //bar after body
	hline(curr_x,winy-2,xmax-1,0);
	hline(curr_x,winy-4,xmax-1,15);
	// vlines of window border
	bar(0,0,5,winy,7); //border of titlebar
	vline(1,2,winy-2,15);
	vline(3,3,winy-3,0);

	bar(xmax-5,0,5,winy,7); //border of titlebar
	vline(xmax-4,2,winy-2,0);
	vline(xmax-2,3,winy-3,15);

	starty=curr_y+30;

	if(view==0)
	{       curr_x=40;
		curr_y+=30;
		for (i=0;i<Active_Count;i++)
		{      //Active_Position[i]=new(int[2]);
			Active_Position[i][0]=curr_x;
			Active_Position[i][1]=curr_y;
			icon.Draw(i,0);
			count++;
			curr_x+=icon.width+50;  //updating x co-ordinate of icon
			if(curr_x+icon.width+10>=xmax-1)  // check for xmax of icon
			{	curr_x=30;
				curr_y+=icon.height+60;
				Active_Column[k]=count;
				k++;
				count=0;
			}
		}
		if(curr_y+icon.height+20<winy)  Active_Column[k]=count;
	}
	else if(view==2||view==1)
	{	starty=curr_y+30;
		curr_x=5;
		if(view==2)
		{  	bar(curr_x,curr_y,xmax-10,height,7);
			hline(curr_x,curr_y,xmax-10,15);
			hline(curr_x,curr_y+height-1,xmax-10,15);
			bar(curr_x,curr_y+height,xmax-10,3,7); //bar after filebar
			hline(curr_x,curr_y+height+1,xmax-10,0);
		}
		k=0;
		curr_x=40;
		curr_y+=30;
		for (i=0;i<Active_Count;i++)
		{     //Active_Position[i]=new(int[2]);
			Active_Position[i][0]=curr_x;
			Active_Position[i][1]=curr_y;
			icon.List_Draw(i,0,view);
			count++;
			curr_y+=icon.height+10;  //updating y co-ordinate of icon
			if(curr_y+icon.height+30>=winy)  // check for ymax of icon
			{	curr_y=starty;
				curr_x+=icon.width+50;
				Active_Column[k]=count;
				k++;
				count=0;
			}
		}
		if(curr_y+icon.height+30<winy)  Active_Column[k]=count;

	}
	//taskbar.Draw_Bar('t');

}

void Window ::Plot_All(char what)
{   int curr_x,curr_y,count=0,k=0,i,height=14;
	Icons icon(1);
	curr_x=5;
	curr_y=filebar.height+32;
	bar(curr_x,curr_y,xmax-10,winy-curr_y-5,bcolor);
	starty=curr_y+30;
	if(what==2)
	{  	bar(curr_x,curr_y,xmax-10,height,7);
		hline(curr_x,curr_y,xmax-10,15);
		hline(curr_x,curr_y+height-1,xmax-10,15);
		bar(curr_x,curr_y+height,xmax-10,3,7); //bar after filebar
		hline(curr_x,curr_y+height+1,xmax-10,0);

	}
	curr_x=40;
	curr_y=starty;
	if(what==0) //icons
	{

		for (i=0;i<Active_Count;i++)
		{      //Active_Position[i]=new(int[2]);
			Active_Position[i][0]=curr_x;
			Active_Position[i][1]=curr_y;
			icon.Draw(i,0);
			count++;
			curr_x+=icon.width+50;  //updating x co-ordinate of icon
			if(curr_x+icon.width+10>=xmax-1)  // check for xmax of icon
			{	curr_x=30;
				curr_y+=icon.height+60;
				Active_Column[k]=count;
				k++;
				count=0;
			}
		}
		if(curr_y+icon.height+20<winy)  Active_Column[k]=count;
	}//end of icons

	else if(what==1 ||what==2)//list
	{ 	k=0;
		for (i=0;i<Active_Count;i++)
		{     //Active_Position[i]=new(int[2]);
			Active_Position[i][0]=curr_x;
			Active_Position[i][1]=curr_y;
			icon.List_Draw(i,0,what);
			count++;
			curr_y+=icon.height+10;  //updating y co-ordinate of icon
			if(curr_y+icon.height+30>=winy)  // check for ymax of icon
			{	curr_y=starty;
				curr_x+=icon.width+50;
				Active_Column[k]=count;
				k++;
				count=0;
			}
		}
		if(curr_y+icon.height+30<winy)  Active_Column[k]=count;

	}//end of list

}
void remove_file(int x,int unwanted)
{       int i,j,flag=0;
	char s[50];
	for(i=0;curr_directory[i]!='\0';i++)
	s[i]=curr_directory[i];
	s[i] ='\0';
	Dir_Entries *entries;
	Directory dir(s);
	entries=dir.dir_read();
	for(i=0;curr_directory[i]!='\0';i++)
	s[i]=curr_directory[i];
	if(i>4)s[i++]=':';
	for(j=0;j<=10;i++,j++)
	{
		if((entries[x+unwanted].name[j]==' '||j==8)&&flag==0)
		{	s[i]='.';
			if(j!=8)j=7;
			else{i++;s[i]=entries[x+unwanted].name[j];}
			flag=1;
		}
		else
		s[i]=entries[x+unwanted].name[j];
	}
	s[i] ='\0';
	write(300,100,4,s);
	getchar();
	File f;
	int file_flag;
	file_flag= f.file_open(s,RO);
	/*if(file_flag==2)
	{
		Error_Code = File_Not_Found;
	} */
	dir.remove_entry(f.file_details.file_name,f.drive);
	d[f.drive-2].clear_fat_entry(f.next_lba,f.drive);
}

void make_directory(char *z)
{       char *dt;
	int i,j;
	for(i=0,j=0;curr_directory[j]!='\0';i++,j++)
		 dt[i]=curr_directory[j];
	dt[i]='\0';
	write(100,100,0,dt);
	char temp_dirname[11];
	//if(z[0]!='e')curry_dir.add_dir(dt);//call md
	if(z[0]!='e')
	{
		for(i=0;z[i]!=0&&i<11;i++) temp_dirname[i]=z[i];
		temp_dirname[i]=0;
		Directory dir(dt);
		dir.add_dir(temp_dirname);//call md
	}
}

void copy_to_clipboard(int x1,char shift,int unwanted)
{       int i,j;
	char s[50];
	clipboard[0]='1';
	if(shift)clipboard[1]='0';
	else clipboard[1]='1';
	for(i=0;curr_directory[i]!='\0';i++)
		s[i]=curr_directory[i];
	s[i] ='\0';
	Dir_Entries *entries;
	Directory dir(s);
	entries=dir.dir_read();
	for(i=0;curr_directory[i]!='\0';i++)
	s[i]=curr_directory[i];
	if(i>4)s[i++]=':';
	for(j=0;j<=10;i++,j++)
	{
		if(entries[x1+unwanted].name[j]==' ')
		{       s[i]='.';
			j=7;
		}
	       else
		s[i]=entries[x1+unwanted].name[j];
	}
	s[i] ='\0';
	for(i=0,j=2;s[i]!='\0';i++,j++)
		clipboard[j]=s[i];
	clipboard[j]='\0';
}

void init_shell()
{	cmd_buff[cmd][0]='C';
	cmd_buff[cmd][1]=':';
	cmd_buff[cmd][2]=0;
	int r=command();
}

⌨️ 快捷键说明

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