本文的讲解是循序渐进的,读者应该重点关注每个步骤的理解,两步之间代码的变化,即可完全理解本文。

1.素材准备

  1. easyx的下载链接如下:(本文使用的版本是2014冬至版)
    https://www.easyx.cn/downloads/
    注:使用easyx需要注意它兼容的编译器(下载的帮助文件会写),不同的easyx兼容的编译器不同,但总是和visual C++6兼容(和字符编码有关),本文以visual C++6编译器为例书写代码。
  2. easyx的最新英文帮助文档链接(下载2014冬至版会自带中文帮助文档):
    https://docs.easyx.cn/en-us/intro
  3. 如果你成功下载了easyx2014冬至版,那么解压后把头文件(easyx.h和graphic.h)和lib文件(amd64)分别放在VC文件夹默认的include文件夹和lib文件夹中。右键你的VC程序,选择打开文件所在位置,然后找到MFC文件夹,友情提供两个文件夹的位置截图。
    include
    lib
  4. 建议编译的C文件以cpp后缀保存。

2.1.创建你的界面

创建一个480×360的窗口,我们需要使用initgraph()函数,闲言少叙,让我们直接看一段代码:

#include <graphics.h>              // 引用图形库头文件
#include <conio.h>
#include <stdio.h>
#include <windows.h>				//用到了定时函数sleep()
#include <math.h>
int main()
	int i;
	short win_width,win_height;//定义窗口的宽度和高度
	win_width = 480;win_height = 360;
	initgraph(win_width,win_height);//初始化窗口(黑屏)
	for(i=0;i<256;i+=5)
		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
		cleardevice();//清屏(取决于背景色)
		Sleep(15);//延时15ms
	closegraph();//关闭绘图界面
    我们尝试在界面创建几个按钮,按钮需要的操作是绘制矩形和打印文字。虽然看着简单,但是里面还是有点学问,为了方便大家理解,还是先放上代码和注释。

#include <graphics.h>              // 引用图形库头文件
#include <conio.h>
#include <stdio.h>
#include <windows.h>				//用到了定时函数sleep()
#include <math.h>
int r1[]={30,20,130,60};//输入按钮的矩形参数
int r2[]={170,20,220,60};//运行按钮的矩形参数
int r3[]={260,20,310,60};//退出按钮的矩形参数
int main()
	int i;
	short win_width,win_height;//定义窗口的宽度和高度
	win_width = 480;win_height = 360;
	initgraph(win_width,win_height);//初始化窗口(黑屏)
	for(i=0;i<256;i+=5)
		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
		cleardevice();//清屏(取决于背景色)
		Sleep(15);//延时15ms
	RECT R1={r1[0],r1[1],r1[2],r1[3]};//矩形指针R1
	RECT R2={r2[0],r2[1],r2[2],r2[3]};//矩形指针R2
	RECT R3={r3[0],r3[1],r3[2],r3[3]};//矩形指针R3
	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内输入文字,水平居中,垂直居中,单行显示
	setlinecolor(BLACK);
	rectangle(r1[0],r1[1],r1[2],r1[3]);
	rectangle(r2[0],r2[1],r2[2],r2[3]);
	rectangle(r3[0],r3[1],r3[2],r3[3]);
	system("pause");//暂停,为了显示
	closegraph();
	return 0;
    LOGFONT是字体样式指针,通过gettextstyle()函数来获取当前的字体类型,再通过settextstyle()函数加以设置。这里只修改了字体的名称和显示质量,还可以修改斜体、下划线等属性,更详细的部分请参考帮助文档。

2.3.鼠标操作

2.3.1.单击特效

#include <windows.h> //用到了定时函数sleep() #include <math.h> int r1[]={30,20,130,60};//输入按钮的矩形参数 int r2[]={170,20,220,60};//运行按钮的矩形参数 int r3[]={260,20,310,60};//退出按钮的矩形参数 int main() int i; short win_width,win_height;//定义窗口的宽度和高度 win_width = 480;win_height = 360; initgraph(win_width,win_height);//初始化窗口(黑屏) for(i=0;i<256;i+=5) setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色 cleardevice();//清屏(取决于背景色) Sleep(15);//延时15ms RECT R1={r1[0],r1[1],r1[2],r1[3]};//按钮1的矩形区域 RECT R2={r2[0],r2[1],r2[2],r2[3]};//按钮2的矩形区域 RECT R3={r3[0],r3[1],r3[2],r3[3]};//按钮2的矩形区域 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内输入文字,水平居中,垂直居中,单行显示 setlinecolor(BLACK); rectangle(r1[0],r1[1],r1[2],r1[3]); rectangle(r2[0],r2[1],r2[2],r2[3]); rectangle(r3[0],r3[1],r3[2],r3[3]); MOUSEMSG m;//鼠标指针 setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色) while(true) m = GetMouseMsg();//获取一条鼠标消息 if(m.uMsg==WM_LBUTTONDOWN) for(i=0;i<=10;i++) setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色 circle(m.x,m.y,2*i); Sleep(25);//停顿2ms circle(m.x,m.y,2*i);//抹去刚刚画的圆 FlushMouseMsgBuff();//清空鼠标消息缓存区 system("pause");//暂停,为了显示 closegraph(); return 0; 这里需要解释的是一个二元光栅设置函数setrop2(),二元光栅是混合背景色和当前颜色的模式。我们这里采用的方式是同或(NOT XOR)的方式,若底色为白色(1),则当前颜色不变;若底色是黑色(0),则当前颜色反色。为什么需要采用这种方式呢?因为我们在第二次抹去原来的圆的时候不能采用白色,否则如果背景色原来就为黑(比如按钮和文字),就也会被抹成白色。而背景色与任意一个颜色同或两次都为其本身,即可起到还原背景色的效果。这里的背景色与cleardevice()前面那个背景色不同,这里的是指执行这一条绘画指令之前屏幕上的颜色。

2.3.2.光标感应

为了方便起见,存放三个按钮的数组我们合并为了一个二维数组,在鼠标事件中更容易使用和分配任务。

#include <graphics.h>              // 引用图形库头文件
#include <conio.h>
#include <stdio.h>
#include <windows.h>				//用到了定时函数sleep()
#include <math.h>
int r[3][4]={{30,20,130,60},{170,20,220,60},{260,20,310,60}};//三个按钮的二维数组
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;
	return 0;
int main()
	int i,event=0;
	short win_width,win_height;//定义窗口的宽度和高度
	win_width = 480;win_height = 360;
	initgraph(win_width,win_height);//初始化窗口(黑屏)
	for(i=0;i<256;i+=5)
		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
		cleardevice();//清屏(取决于背景色)
		Sleep(15);//延时15ms
	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]};
	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内输入文字,水平居中,垂直居中,单行显示
	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]);
	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)
					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,2*i);
					Sleep(30);//停顿30ms
					circle(m.x,m.y,2*i);//抹去刚刚画的圆
				break;
				FlushMouseMsgBuff();//清空鼠标消息缓存区
	system("pause");//暂停,为了显示
	return 0;
	float dt = 0.01;//仿真间隔10ms
	long int N = (long int)(sim_t/dt);//迭代次数
	float *h=(float*)calloc(N,sizeof(float));//高度
	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
	long int i;//迭代变量
	for(i=1;i<N;i++)
		if(h[i-1]>R)//未发生碰撞
			v[i]=v[i-1]-9.8*dt;//速度计算
		else//发生碰撞,动能损失alpha,速度损失alpha的开方
			v[i]=-sqrt(alpha)*v[i-1];	
	free(h);
	free(v);//释放内存
	return 0;
	setlinecolor(BLACK);
	setlinestyle(PS_SOLID);//实线
	rectangle(30,100,420,330);//外框线
	setlinestyle(PS_DOT);//点线
	for(i=30+39;i<420;i+=39)
		line(i,100,i,330);//竖直辅助线
	for(i=100+23;i<330;i+=23)
		line(30,i,420,i);//水平辅助线
	float dt = 0.01;//仿真间隔10ms
	float dy = 230/h0;//单位纵坐标
	long int N = (long int)(sim_t/dt);//迭代次数
	float *h=(float*)calloc(N,sizeof(float));//高度
	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
	long int i;//迭代变量
	float process_duty;//进度
	init_figure();//初始化图像网格
	setrop2(R2_COPYPEN);//当前颜色
	//计算步骤
	h[0]=h0;v[0]=0;
	for(i=1;i<N;i++)
		if(h[i-1]>R)//未发生碰撞
			v[i]=v[i-1]-9.8*dt;//速度计算
		else//发生碰撞,动能损失alpha,速度损失alpha的开方
			v[i]=-sqrt(alpha)*v[i-1];	
		h[i]=h[i-1]+v[i]*dt;//高度计算
		process_duty = (i+1)/(float)(N);
		putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED);//画点putpixel(X,Y,color*)
		Sleep(dt*1000);//延时
	free(h);
	free(v);
	return 0;
    现在我们只剩下了刻画进度条的函数了,进度条的刷新很明显是应该放在for循环里面的,那么我们采用什么进度条的格式呢?进度条可以有圆形、扇形、长条连续型、长条不连续型等多种,我们这里采用的是环形进度条,将进度数字显示在环中心。请看以下的对simulation()函数改进的代码:

//仿真运行
int simulation()
	char t[3];//百分值的字符
	char *out_text;//带百分号的百分字符
	float dt = 0.01;//仿真间隔10ms
	float dy = 230/h0;//单位纵坐标
	long int N = (long int)(sim_t/dt);//迭代次数
	float *h=(float*)calloc(N,sizeof(float));//高度
	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
	long int i;//迭代变量
	float process_duty;//进度
	RECT r={370,35,400,65};//百分值显示区域的矩形指针
	init_figure();//初始化图像网格
	setrop2(R2_COPYPEN);//当前颜色
	setfillcolor(WHITE);
	setlinecolor(WHITE);
	fillrectangle(354,19,411,81);//覆盖原进度条区域
	setlinestyle(PS_NULL);//无线条
	setbkmode(TRANSPARENT);//设置文字填充背景为透明
	//计算步骤
	h[0]=h0;v[0]=0;
	BeginBatchDraw();//开始缓存区
	for(i=1;i<N;i++)
		if(h[i-1]>R)//未发生碰撞
			v[i]=v[i-1]-9.8*dt;//速度计算
		else//发生碰撞,动能损失alpha,速度损失alpha的开方
			v[i]=-sqrt(alpha)*v[i-1];	
		setfillcolor(WHITE);
		setlinecolor(WHITE);
		fillrectangle(354,19,416,81);//覆盖原进度条区域
		h[i]=h[i-1]+v[i]*dt;//高度计算
		process_duty = (i+1)/(float)(N);
		setlinestyle(PS_SOLID);
		putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED);
		setfillcolor(BLUE);
		setlinestyle(PS_NULL);
		fillpie(355,20,415,80,0,process_duty*2*PI);
		setfillcolor(WHITE);
		fillcircle(385,50,20);
		sprintf(t,"%d",(int)(process_duty*100.0));//整型转换为字符串
		out_text = strcat(t,"%");//添加一个百分号
		drawtext(out_text,&r,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		Sleep(dt*1000);
		FlushBatchDraw();//刷新缓存区
	EndBatchDraw();//结束缓存区
	free(h);
	free(v);
	return 0;
    FlushBatchDraw()函数是刷新缓存区的函数,与BeginBatchDraw()EndBatchDraw()一起使用,如果我们绘图之后不想立即显示,而想批量绘图最后一起刷新画板,用缓存区的方法再合适不过了。

3.完整代码及效果

#include <graphics.h>              // 引用图形库头文件
#include <conio.h>
#include <stdio.h>
#include <windows.h>				//用到了定时函数sleep()
#include <math.h>
#include <string.h>
#define PI 3.1416
int r[3][4]={{30,20,130,60},{170,20,220,60},{260,20,310,60}};//三个按钮的二维数组
float alpha,R,h0,sim_t;//碰撞时的能量损失率,球的半径、初始高度、仿真时间
//按钮判断函数
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;
	return 0;
//初始化图像
void init_figure()
	int i;
	setrop2(R2_COPYPEN);//当前颜色
	setlinecolor(BLACK);
	setlinestyle(PS_SOLID);//实线
	rectangle(30,100,420,330);//外框线
	setlinestyle(PS_DOT);//点线
	for(i=30+39;i<420;i+=39)
		line(i,100,i,330);//竖直辅助线
	for(i=100+23;i<330;i+=23)
		line(30,i,420,i);//水平辅助线
//仿真运行
int simulation()
	char t[3];//百分值的字符
	char *out_text;
	float dt = 0.01;//仿真间隔10ms
	float dy = 230/h0;//单位纵坐标
	long int N = (long int)(sim_t/dt);//迭代次数
	float *h=(float*)calloc(N,sizeof(float));//高度
	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
	long int i;//迭代变量
	float process_duty;//进度
	RECT r={370,35,400,65};//百分值显示区域的矩形指针
	init_figure();//初始化图像网格
	setrop2(R2_COPYPEN);//当前颜色
	setfillcolor(WHITE);
	setlinecolor(WHITE);
	fillrectangle(354,19,411,81);//覆盖原进度条区域
	setlinestyle(PS_NULL);//无线条
	setbkmode(TRANSPARENT);//设置文字填充背景为透明
	//计算步骤
	h[0]=h0;v[0]=0;
	BeginBatchDraw();//开始缓存区
	for(i=1;i<N;i++)
		if(h[i-1]>R)//未发生碰撞
			v[i]=v[i-1]-9.8*dt;//速度计算
		else//发生碰撞,动能损失alpha,速度损失alpha的开方
			v[i]=-sqrt(alpha)*v[i-1];	
		setfillcolor(WHITE);
		setlinecolor(WHITE);
		fillrectangle(354,19,416,81);//覆盖原进度条区域
		h[i]=h[i-1]+v[i]*dt;//高度计算
		process_duty = (i+1)/(float)(N);
		setlinestyle(PS_SOLID);
		putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED);
		setfillcolor(BLUE);
		setlinestyle(PS_NULL);
		fillpie(355,20,415,80,0,process_duty*2*PI);
		setfillcolor(WHITE);
		fillcircle(385,50,20);
		sprintf(t,"%d",(int)(process_duty*100.0));//整型转换为字符串
		out_text = strcat(t,"%");//添加一个百分号
		drawtext(out_text,&r,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		Sleep(dt*1000);
		FlushBatchDraw();//刷新缓存区
	EndBatchDraw();//结束缓存区
	free(h);
	free(v);
	return 0;
int main()
	int i,event=0;
	char s[30];//输入字符串变量
	short win_width,win_height;//定义窗口的宽度和高度
	win_width = 480;win_height = 360;
	initgraph(win_width,win_height);//初始化窗口(黑屏)
	for(i=0;i<256;i+=5)
		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
		cleardevice();//清屏(取决于背景色)
		Sleep(30);//延时30ms
	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]};
	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内输入文字,水平居中,垂直居中,单行显示
	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]);
	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)
					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,2*i);
					Sleep(20);//停顿30ms
					circle(m.x,m.y,2*i);//抹去刚刚画的圆
				//按照按钮判断左键单击后的操作
				switch(button_judge(m.x,m.y))
					//复原按钮原型
					case 1:
						InputBox(s,30,"请输入碰撞时的能量损失率、球的半径、初始高度、仿真时间");
						sscanf(s,"%f%f%f%f",&alpha,&R,&h0,&sim_t);//将输入字符串依次扫描到全局变量里面
						FlushMouseMsgBuffer();//单击事件后清空鼠标消息
						break;
					case 2:
						simulation();//仿真运行
						FlushMouseMsgBuffer();//单击事件后清空鼠标消息
						break;
					case 3:
						closegraph();//关闭绘图环境
						exit(0);//正常退出
					default:
						FlushMouseMsgBuffer();//单击事件后清空鼠标消息
						//printf("\r\n(%d,%d)",m.x,m.y);//打印鼠标坐标,方便调试时确定区域
						break;
				break;
	return 0;

在这里插入图片描述
在这里插入图片描述
希望本文对您有帮助,谢谢阅读。

本书介绍了如何为使用C语言编写的应用程序设计一个“自汉字环境”的窗口式图形用户界面。书中系统地介绍了VGA显示卡、鼠标、键盘和扩充存储器等设备的编程方法,并在此基础上建立了一个内式汉字编程环境HANENV,包扩一个头文件和200多个库函数。将HANENV加入Tur-boC之后,就可以在编写应用程序时直接引用其库函数。这些库函数的功能包括汉字的输入、存储和显示;时钟、定时器和闪烁光标;全屏幕数据录人和画图;窗口、滚动条、按键式菜单以及代码表等窗口式界面部件等。同时在HANENV系统中还提供了计算器、调色板、文件目录窗口以及屏幕平滑移动等功能,使用HANENV编写的软件经编译后可以直接在西文DOS环境下运行而具有强大的汉字处理能力。因此HANENV系统是使用C语言编写华丽而实用的用户界面应用程序的最佳编程环境。 用户可以输入两个数字。用户可以选择加法、减法、乘法或除法。显示计算结果。本文介绍了如何在 C++ 中使用 Qt 实现一个简单的图形用户界面(GUI)应用程序。通过创建一个基本的计算器,我们学习了如何设计用户界面、处理用户输入和实现功能。希望您能在此基础上进行扩展,构建更复杂的 GUI 应用程序。GUI 开发不仅能提高我们的编程能力,还能帮助我们更好地理解用户体验和交互设计的原则。 GTK就可以,一个基于C语言的免费、开源、跨平台图形工具包,可以直接使用C语言调用实现图形界面开发,下面我简单介绍一下这个工具包的安装和使用,这里以Windows平台为例:1.首先,下载GTK安装包,这个可以直接到CSDN上下载,一个zip压缩包,直接解压就行,地址https://download.csdn.net/download/qq_34816564/10925737,解压后的文件如下:2.... 通过窗口类,我们可以实现自定义的窗口行为和外观。我们首先需要定义一个WNDCLASS结构体变量。如上,我们定义了一个名为wc的WNDCLASS结构体变量,并初始化所有成员为0。使用{0}可以将结构体中的所有成员都设置为默认值。然后我们需要将窗口过程函数的地址赋给WNDCLASS结构体变量的lpfnWndProc成员。窗口过程函数是窗口消息的处理函数,代码如下。然后将当前应用程序的实例句柄赋给WNDCLASS结构体变量的hInstance成员。实例句柄用于标识当前运行的应用程序的实例。 扫雷前言准备工作EasyX的下载一些准备知识头文件的引用图形化界面的创建图形化界面简介鼠标操作提示框 学了那么长时间的C语言,我们所有的一切似乎都被禁锢在黑框框(控制台)里,让人觉得很无趣,学习unity那样的平台又太过困难,那么有没有什么是适合我们这些新手使用的?答案是:有! EasyX 是针对 C/C++ 的图形库,可以帮助使用C/C++语言的程序员快速上手图形和游戏编程。 这是百度百科上的解释,目前就我的理解,下载并安装Easyx就相当于为我们的VS(或者是别的)增加了一些库函数,以便我们实 最近t哥经过两天三夜不懈的努力下载了Visual Studio 2019准备大干一番(装了躺尸)。安装完毕运行良好,我心甚慰,听到某二货说C语言有啥好的,整天面对着黑不拉几的窗口。当时我就怒怼道:放屁,还可以是白的!! 于是我立马就准备演示给他看:(等等,不会真有人相信我真要用白窗口来震慑他吧) NONONO t哥今天来的是c语言编程图形化界面easyx... 看到其符号常量的十六进制值,想必我不说你也能看出来,这就是默认值,也就是说,就算我们不使用此标志,也是没有关系的,默认创建的就是这个。可以发现CreateWindow 函数的自由度还是比较高的,但创建的时候需要填写的内容太多了,我们之前只是简单的进行了一个封装,使其完全丧失了自由度,接下来我们进行新一轮的封装,让其为我们后续的开发提供更大的便利。前面那个复选框,你可以发现,他点击后并没有勾选,使用BS_AUTOCHECKBOX (0x00000003)可以创建一个自动复选框样式的按钮。 用C语言实现俄罗斯方块,需要先解决下面几个问题: 1、如何用C语言绘制图形界面 EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。 包库#include 先初始化图形窗口 initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH为窗口的宽,WINDOW_HIGH为窗口的高度。 该楼层疑似违规已被系统折叠隐藏此楼查看此楼贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面。大家也都有回答,需要其他的库。MFC,GTK,QT。本人近期刚用GTK库加上纯C写成了第一个LINUX实用程序。现在与大家分享:主界面程序gmaxtrix.c#include#include"client_socket.h"#define MAX_BUFFER 1024static ...