#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;
}