基于C++的图形化

#include <graphics.h>              // 引用图形库头文件
#include <conio.h>
#include <stdio.h>
#include <windows.h>				//用到了定时函数sleep()
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define PI 3.1416

int r[4][4]={{30,20,130,60},{270,20,340,60},{360,20,410,60},{150,20,250,60}};//三个按钮的二维数组

float total = 1000, used = 0, Rsize = 0;	//总内存,已使用内存,输入的进程大小

int a[10] = {0,0,0,0,0, 0,0,0,0,0};
int index = 0;
int sum = 0;

//按钮判断函数
int button_judge(int x,int y)
{
	if(x>r[0][0] && x<r[0][2] && y>r[0][1] && y<r[0][3])return 1;
	if(x>r[1][0] && x<r[1][2] && y>r[1][1] && y<r[1][3])return 2;
	if(x>r[2][0] && x<r[2][2] && y>r[2][1] && y<r[2][3])return 3;
	if(x>r[3][0] && x<r[3][2] && y>r[3][1] && y<r[3][3])return 4;
	return 0;
}


//初始化图像
void init_figure()
{
	int i,j;
	setrop2(R2_COPYPEN);	//当前颜色
	setlinecolor(BLACK);


	RECT Rtitle1 = {150,100,230,120};
	drawtext("剩余内存:",&Rtitle1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
	RECT Rtitle2 = {240,100,290,120};
	
	char buf[10];
	itoa(1000,buf,10);
	drawtext(buf,&Rtitle2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示

	setlinestyle(PS_SOLID);		//实线
	rectangle(40,130,220,330);	//外框线
	setlinestyle(PS_DOT);		//点线

	setlinestyle(PS_SOLID);		//实线
	rectangle(250,130,430,330);	//外框线
	setlinestyle(PS_DOT);		//点线

	for(i=130,j=10; j>=0; i+=20,j--)
	{
		if(j==10){
			RECT RT1={2,130-6,9,130+6};
			drawtext("1",&RT1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
			RECT RR1={10,i-6,17,i+6};
			drawtext("0",&RR1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示

			RECT L1={230,314,238,326};
			drawtext("1",&L1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
			RECT L2={239,314,247,326};
			drawtext("0",&L2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
		}
		else if(j>0){
			RECT RR1={10,i-6,17,i+6};
			drawtext(j+'0',&RR1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
		}
		RECT RR2={18,i-6,25,i+6};
		drawtext("0",&RR2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
		RECT RR3={26,i-6,35,i+6};
		drawtext("%",&RR3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
		
		if(j>0 && j<10) {
			line(40,i,220,i);		//水平辅助线
			
			RECT LL3={235,i-16,245,i-4};
			drawtext(10-j+'0',&LL3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
			line(250,i,430,i);		//水平辅助线
		}
	}
}


//仿真运行:添加
int simulation_add(int x)
{
	int i;
	int s = (int)(330-200*(used/1000));
	
	fillrectangle(40,s-200*(x*1.0/1000)-1,220,s+1);

	/*顶部剩余内存显示*/
	RECT Rtitle2 = {240,100,290,120};
	//清除掉之前的数字内容
	settextcolor(WHITE);
	drawtext("0000", &Rtitle2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
	
	settextcolor(BLACK);
	char buf[10];
	itoa(1000-used-x,buf,10);
	drawtext(buf, &Rtitle2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示

	/* 右边进程创建 */
	if(Rsize!=0 && sum<10){
		while(a[index]!=0){
			index = (index+1)%10;
		}
		a[index] = Rsize;
		sum ++;

		RECT CT = {270,130+index*20,370,130+index*20+20};
		drawtext("进程大小为", &CT,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
		RECT CT1 = {370,130+index*20,400,130+index*20+20};
		char buf[10];
		itoa(Rsize,buf,10);
		drawtext(buf, &CT1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示

		index = (index+1)%10;
	}

	used += Rsize;
	return 0;
}

//仿真运行:删除
int simulation_del(int x)
{
	int i;
	int s = (int)(330-200*(used/1000));
	
	fillrectangle(40,s-1,220,s+200*(a[x]*1.0/1000)+1);
	
	used -= a[x];
	
	/*顶部剩余内存显示*/
	RECT Rtitle2 = {240,100,290,120};
	//清除掉之前的数字内容
	settextcolor(WHITE);
	drawtext("0000", &Rtitle2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示
	//显示新内容
	settextcolor(BLACK);
	char buf[10];
	itoa(1000-used,buf,10);
	drawtext(buf, &Rtitle2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示

	/* 右边进程删除 */
	if(Rsize!=0){
		a[x] = 0;
		sum --;

		//清除掉之前的数字内容
		settextcolor(WHITE);
		RECT CT = {270,130+x*20,400,130+x*20+20};
		drawtext("                 ", &CT,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域内输入文字,水平居中,垂直居中,单行显示

	}
	

	return 0;
}


int main()
{
	int j;
	int i,event=0;
	char s[30];//输入字符串变量
	short win_width = 480,win_height = 360;//定义窗口的宽度和高度
	initgraph(win_width,win_height);//初始化窗口(黑屏)

	

	for(i=0;i<256;i+=5)
	{
		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
		cleardevice();//清屏(取决于背景色)
	}

	RECT R1={r[0][0],r[0][1],r[0][2],r[0][3]};
	RECT R2={r[1][0],r[1][1],r[1][2],r[1][3]};
	RECT R3={r[2][0],r[2][1],r[2][2],r[2][3]};
	RECT R4={r[3][0],r[3][1],r[3][2],r[3][3]};


	LOGFONT f;//字体样式指针
	gettextstyle(&f);					//获取字体样式
	_tcscpy(f.lfFaceName,_T("宋体"));	//设置字体为宋体
	f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
	settextstyle(&f);                     // 设置字体样式
	settextcolor(BLACK);				//BLACK在graphic.h头文件里面被定义为黑色的颜色常量

	drawtext("添加进程",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
	drawtext("清空内存",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示
	drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示
	drawtext("删除进程",&R4,DT_CENTER | DT_VCENTER | DT_SINGLELINE);	//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示

	setlinecolor(BLACK);
	rectangle(r[0][0],r[0][1],r[0][2],r[0][3]);
	rectangle(r[1][0],r[1][1],r[1][2],r[1][3]);
	rectangle(r[2][0],r[2][1],r[2][2],r[2][3]);
	rectangle(r[3][0],r[3][1],r[3][2],r[3][3]);

	init_figure();

	MOUSEMSG m;//鼠标指针
	
	while(true)
	{
		m = GetMouseMsg();//获取一条鼠标消息

		switch(m.uMsg)
		{
			case WM_MOUSEMOVE:
				setrop2(R2_XORPEN);
				setlinecolor(LIGHTCYAN);//线条颜色为亮青色
				setlinestyle(PS_SOLID, 3);//设置画线样式为实现,10磅
				setfillcolor(WHITE);//填充颜色为白色
				if(button_judge(m.x,m.y)!=0)
				{
					if(event != button_judge(m.x,m.y))
					{
						event = button_judge(m.x,m.y);//记录这一次触发的按钮
						fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//有框填充矩形(X1,Y1,X2,Y2)
					}
				}
				else
				{
					if(event!=0)//上次触发的按钮未被修正为原来的颜色
					{
						fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//两次同或为原来颜色
						event = 0;
					}
				}
				break;
			case WM_LBUTTONDOWN:
				setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色)
				for(i=0;i<=10;i++)
				{
					setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色
					circle(m.x,m.y,3*i);
					Sleep(50);//停顿30ms
					circle(m.x,m.y,3*i);//抹去刚刚画的圆
				}

				//按照按钮判断左键单击后的操作
				switch(button_judge(m.x,m.y))
				{
					//复原按钮原型
					case 1:
						InputBox(s,30,"请输入进程大小");
						sscanf(s,"%f",&Rsize);		//将输入字符串依次扫描到全局变量里面
						if(used+Rsize>1000 || sum>=10){
							MessageBox(GetForegroundWindow(),"剩余内存不足或进程已满!","输入错误",1);
							Rsize = 0;
						}
						
						setfillcolor(BLACK);
						simulation_add(Rsize);		//仿真运行
						FlushMouseMsgBuffer();		//单击事件后清空鼠标消息
						Rsize = 0;
						break;
					case 2:
						for(j = 0; j < 10; j ++){
							if(a[j] != 0){
								Rsize = 1;
								setfillcolor(BLACK);
								simulation_del(j);
								Rsize = 0;
							}
						}
						
						FlushMouseMsgBuffer();		//单击事件后清空鼠标消息
						break;
					case 3:
						closegraph();	//关闭绘图环境
						exit(0);		//正常退出
					case 4:
						InputBox(s,30,"请输入删除进程的序号");
						sscanf(s,"%f",&Rsize);		//将输入字符串依次扫描到全局变量里面
						if(Rsize>10 || Rsize<1){
							MessageBox(GetForegroundWindow(),"进行序号不合法,请输入数字0-9","输入错误",1);
							Rsize = 0;
						}
						else if(a[(int)(Rsize-1)] == 0){
							MessageBox(GetForegroundWindow(),"该内存块中无进程","输入错误",1);
							Rsize = 0;
						}

						setfillcolor(BLACK);
						simulation_del(Rsize-1);		//仿真运行
						FlushMouseMsgBuffer();		//单击事件后清空鼠标消息
						Rsize = 0;
						break;
					default:
						FlushMouseMsgBuffer();		//单击事件后清空鼠标消息
						//printf("\r\n(%d,%d)",m.x,m.y);//打印鼠标坐标,方便调试时确定区域
						break;
				}
				break;
		}
	}
	return 0;
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值