用EasyX实现一个简易的画板

背景:白色,大小为800*600

按a/d切换颜色,共四种颜色可切换,颜色可自行在程序中调整

笔刷大小共25个尺寸,按q/e键切换

同时为四种颜色设定四个颜色选择框

鉴于以上,共设定了三个不同功能的函数来完成该画板

1.定义全局变量

//四个颜色红、粉、黑、白存入数组
int colors[] = { RGB(255,0,0),RGB(255,174,201),RGB(0,0,0),RGB(255,255,255) };
int ci = 0; //颜色下标,用于修改颜色
int brushSize = 10; //表笔刷大小
int left = 450, spacing = 50; //四个颜色选择框的左边位置和相互间隔

注:需包含头文件stdio.h和easyx.h(或graphics.h)

2.初始化界面函数

void initSketchpad()
{
	initgraph(800, 600); //画板大小
	setbkcolor(WHITE); //背景颜色
	cleardevice();

	setlinecolor(BLACK);
	setlinestyle(PS_SOLID); //设置线:黑、实线
	line(0, 60, 800, 60); //画线(调色板与画图区的分割线)
	refreshColor(); //进入刷新颜色选择框函数

	settextcolor(BLACK);
	settextstyle(50, 0, "consolas"); //设置文字:黑、长度50、宽自适应,楷体
	//绘制QEAD四个字母
	outtextxy(100, 5, 'Q');
	outtextxy(235, 5, 'E');
	outtextxy(left - 65, 5, 'A');
	outtextxy(left + spacing * 3 + 70, 5, 'D');
	
	setfillcolor(BLACK); //设置填充:黑
	//绘制文字旁边的四个三角形
	int pts1[] = { 130,30,150,40,150,20 };
	solidpolygon((POINT*)pts1, 3);
	int pts2[] = { 230,30,210,40,210,20 };
	solidpolygon((POINT*)pts2, 3);
	int pts3[] = { left - 30,30,left - 10,40,left - 10,20 };
	solidpolygon((POINT*)pts3, 3);
	int pts4[] = { left + spacing * 3 + 60 ,30,left + spacing * 3 + 40,40,left + spacing * 3 + 40,20 };
	solidpolygon((POINT*)pts4, 3);
}

3.刷新笔刷大小和颜色函数

void refreshBrush()
{
	clearcircle(180, 30, 28); //用背景色清空圆形笔刷区域
	setlinecolor(CYAN);
	setlinestyle(PS_SOLID, 3); //设置线:青色、实线、线宽3
	setfillcolor(colors[ci]); //设置填充:根据ci选择填充的颜色
	solidcircle(180, 30, brushSize); //绘制有边框的圆形,圆形半径根据brushSize确定
}

4.刷新颜色选择框函数

void refreshColor()
{
	//用背景色清空颜色选择区域
	clearrectangle(left - 3, 12, left + spacing * 3 + 33, 48);
	//绘制四个不同的颜色,正方形30*30
	setfillcolor(colors[0]);
	solidrectangle(left + spacing * 0, 15, left + spacing * 0 + 30, 45);
	setfillcolor(colors[1]);
	solidrectangle(left + spacing * 1, 15, left + spacing * 1 + 30, 45);
	setfillcolor(colors[2]);
	solidrectangle(left + spacing * 2, 15, left + spacing * 2 + 30, 45);
	setfillcolor(colors[3]);
	solidrectangle(left + spacing * 3, 15, left + spacing * 3 + 30, 45);
	setlinecolor(CYAN);
	setlinestyle(PS_SOLID, 3); //设置线:青色、实线、线宽3
	setfillcolor(colors[ci]); //设置填充:根据ci选择填充的颜色
	fillrectangle(left + spacing * ci, 15, left + spacing * ci + 30, 45); //绘制有边框的圆形,圆形半径根据brushSize确定
	refreshBrush();
}

5.定义主函数

int main()
{
	initSketchpad();

	ExMessage m; //创建消息结构体
	short x = 0, y = 0; //创建坐标x,y
	while (1) {
		m = getmessage(EX_MOUSE | EX_KEY); //m接收消息,包括鼠标和键盘消息
		//根据消息类型进入switch选择
		switch (m.message) {
		case WM_LBUTTONDOWN: //如果是鼠标左键按下
			if (m.y > 60) { //如果当前鼠标坐标y>60,即不在笔刷,颜色状态栏内
				setlinestyle(PS_SOLID, brushSize); //设置线:实线,线宽brushSize
				putpixel(m.x, m.y, colors[ci]); //根据当前鼠标坐标和选择的颜色绘制点
			}
			x = m.x;
			y = m.y; //更新点坐标
			break;
		case WM_MOUSEMOVE: //如果是鼠标移动
			if (m.lbutton) { //如果鼠标左键点击(结合case看,效果就是点击左键并拖动)
				//如果当前坐标y>60并且保存的上一个点y>60(即两个点都不在笔刷、颜色状态栏内)
				if (m.y > 60 && y > 60) {
					setlinecolor(colors[ci]);
					setlinestyle(PS_SOLID, brushSize); //设置线:当前选择的颜色ci,实线,线宽brushSize
					line(x, y, m.x, m.y);
				}
				x = m.x;
				y = m.y;
			}
			break;
		case WM_KEYDOWN: //如果是键盘输入
			if (m.vkcode == 'A' || m.vkcode == 'a') { //如果是A和a
				if (ci-- == 0)  ci = 3; //若ci此时为0,则ci减一后为-1,故设置ci为3
				refreshColor(); //刷新颜色选择框
			}
			if (m.vkcode == 'D' || m.vkcode == 'd') { //如果是D和d
				if (ci++ == 3)  ci = 0; //若ci此时为3,则ci加一后为4,故设置ci为0
				refreshColor(); //刷新颜色选择框
			}
			if (m.vkcode == 'Q' || m.vkcode == 'q') { //如果是Q和q
				if (brushSize-- == 1)  brushSize = 1; //若brushSize此时为1,则其减一后为0,故设置其仍为1
				refreshBrush(); //刷新笔刷大小和颜色
			}
			if (m.vkcode =='E' || m.vkcode == 'e') { //如果是D和d
				if (brushSize++ == 25)  brushSize = 25; //若brushSize此时为25,则其加一后为26,故设置其仍为25
				refreshBrush(); //刷新笔刷大小和颜色
			}
		}
	}

	getchar();
	return 0;
}

说明:

主函数为整个程序的最重要的部分,获取键盘和鼠标输入的功能都定义在了这里,但也可以将其封装成单独的函数,从而使主函数看起来更简洁,功能更专一

6.完整代码展示

#include<stdio.h>
#include<easyx.h>

//四个颜色红、粉、黑、白存入数组
int colors[] = { RGB(255,0,0),RGB(255,174,201),RGB(0,0,0),RGB(255,255,255) };
int ci = 0; //颜色下标,用于修改颜色
int brushSize = 10; //表笔刷大小
int left = 450, spacing = 50; //四个颜色选择框的左边位置和间隔
//初始化面板界面选择函数
void initSketchpad();
//刷新颜色选择框函数
void refreshBrush();
//刷新笔刷大小和颜色函数
void refreshColor();

int main()
{
	initSketchpad();

	ExMessage m; //创建消息结构体
	short x = 0, y = 0; //创建坐标x,y
	while (1) {
		m = getmessage(EX_MOUSE | EX_KEY); //m接收消息,包括鼠标和键盘消息
		//根据消息类型进入switch选择
		switch (m.message) {
		case WM_LBUTTONDOWN: //如果是鼠标左键按下
			if (m.y > 60) { //如果当前鼠标坐标y>60,即不在笔刷,颜色状态栏内
				setlinestyle(PS_SOLID, brushSize); //设置线:实线,线宽brushSize
				putpixel(m.x, m.y, colors[ci]); //根据当前鼠标坐标和选择的颜色绘制点
			}
			x = m.x;
			y = m.y; //更新点坐标
			break;
		case WM_MOUSEMOVE: //如果是鼠标移动
			if (m.lbutton) { //如果鼠标左键点击(结合case看,效果就是点击左键并拖动)
				//如果当前坐标y>60并且保存的上一个点y>60(即两个点都不在笔刷、颜色状态栏内)
				if (m.y > 60 && y > 60) {
					setlinecolor(colors[ci]);
					setlinestyle(PS_SOLID, brushSize); //设置线:当前选择的颜色ci,实线,线宽brushSize
					line(x, y, m.x, m.y);
				}
				x = m.x;
				y = m.y;
			}
			break;
		case WM_KEYDOWN: //如果是键盘输入
			if (m.vkcode == 'A' || m.vkcode == 'a') { //如果是A和a
				if (ci-- == 0)  ci = 3; //若ci此时为0,则ci减一后为-1,故设置ci为3
				refreshColor(); //刷新颜色选择框
			}
			if (m.vkcode == 'D' || m.vkcode == 'd') { //如果是D和d
				if (ci++ == 3)  ci = 0; //若ci此时为3,则ci加一后为4,故设置ci为0
				refreshColor(); //刷新颜色选择框
			}
			if (m.vkcode == 'Q' || m.vkcode == 'q') { //如果是Q和q
				if (brushSize-- == 1)  brushSize = 1; //若brushSize此时为1,则其减一后为0,故设置其仍为1
				refreshBrush(); //刷新笔刷大小和颜色
			}
			if (m.vkcode =='E' || m.vkcode == 'e') { //如果是D和d
				if (brushSize++ == 25)  brushSize = 25; //若brushSize此时为25,则其加一后为26,故设置其仍为25
				refreshBrush(); //刷新笔刷大小和颜色
			}
		}
	}
	return 0;
}
//初始画板界面函数
void initSketchpad()
{
	initgraph(800, 600);
	setbkcolor(WHITE);
	cleardevice();

	setlinecolor(BLACK);
	setlinestyle(PS_SOLID); //设置线:黑、实线
	line(0, 60, 800, 60); //画线(调色板与画图区的分割线)
	refreshColor(); //进入刷新颜色选择框函数

	settextcolor(BLACK);
	settextstyle(50, 0, "consolas"); //设置文字:黑、长度50、宽自适应,楷体
	//绘制QEAD四个字母
	outtextxy(100, 5, 'Q');
	outtextxy(235, 5, 'E');
	outtextxy(left - 65, 5, 'A');
	outtextxy(left + spacing * 3 + 70, 5, 'D');
	
	setfillcolor(BLACK); //设置填充:黑
	//绘制文字旁边的四个三角形
	int pts1[] = { 130,30,150,40,150,20 };
	solidpolygon((POINT*)pts1, 3);
	int pts2[] = { 230,30,210,40,210,20 };
	solidpolygon((POINT*)pts2, 3);
	int pts3[] = { left - 30,30,left - 10,40,left - 10,20 };
	solidpolygon((POINT*)pts3, 3);
	int pts4[] = { left + spacing * 3 + 60 ,30,left + spacing * 3 + 40,40,left + spacing * 3 + 40,20 };
	solidpolygon((POINT*)pts4, 3);
}
//刷新笔刷大小和颜色函数
void refreshBrush()
{
	clearcircle(180, 30, 28); //用背景色清空圆形笔刷区域
	setlinecolor(CYAN);
	setlinestyle(PS_SOLID, 3); //设置线:青色、实线、线宽3
	setfillcolor(colors[ci]); //设置填充:根据ci选择填充的颜色
	solidcircle(180, 30, brushSize); //绘制有边框的圆形,圆形半径根据brushSize确定
}
//刷新颜色选择框函数
void refreshColor()
{
	//用背景色清空颜色选择区域
	clearrectangle(left - 3, 12, left + spacing * 3 + 33, 48);
	//绘制四个不同的颜色,正方形30*30
	setfillcolor(colors[0]);
	solidrectangle(left + spacing * 0, 15, left + spacing * 0 + 30, 45);
	setfillcolor(colors[1]);
	solidrectangle(left + spacing * 1, 15, left + spacing * 1 + 30, 45);
	setfillcolor(colors[2]);
	solidrectangle(left + spacing * 2, 15, left + spacing * 2 + 30, 45);
	setfillcolor(colors[3]);
	solidrectangle(left + spacing * 3, 15, left + spacing * 3 + 30, 45);
	setlinecolor(CYAN);
	setlinestyle(PS_SOLID, 3); //设置线:青色、实线、线宽3
	setfillcolor(colors[ci]); //设置填充:根据ci选择填充的颜色
	fillrectangle(left + spacing * ci, 15, left + spacing * ci + 30, 45); //绘制有边框的圆形,圆形半径根据brushSize确定
	refreshBrush();
}

 

 

 

 

要使用easyx实现一个秒表,你需要以下步骤: 1. 在你的C++项目中,添加EasyX图形库的头文件和库文件。 2. 创建一个窗口,设置窗口大小和标题。 3. 使用time.h头文件中的clock()函数来计算时间。 4. 在窗口中绘图,显示秒表的数字和按钮。 5. 在按钮上添加事件,当用户单击按钮时,开始计时,并在窗口上更新秒表的数字。 6. 当用户再次单击按钮时,停止计时。 下面是一个简单的示例代码: ```c++ #include <graphics.h> #include <time.h> int main() { // 创建窗口 initgraph(400, 300); setbkcolor(WHITE); cleardevice(); settextcolor(BLACK); settextstyle(20, 0, _T("微软雅黑")); outtextxy(150, 50, _T("秒表")); // 定义变量 int start_time = 0, end_time = 0, elapsed_time = 0; TCHAR buffer[10]; bool is_running = false; // 绘制按钮 rectangle(150, 150, 250, 200); outtextxy(175, 170, _T("开始")); // 监听鼠标事件 MOUSEMSG m; while (true) { m = GetMouseMsg(); if (m.uMsg == WM_LBUTTONDOWN) { if (m.x >= 150 && m.x <= 250 && m.y >= 150 && m.y <= 200) { if (!is_running) { start_time = clock(); is_running = true; settextcolor(RED); outtextxy(180, 100, _T("计时中...")); } else { end_time = clock(); elapsed_time = end_time - start_time; is_running = false; settextcolor(BLACK); outtextxy(180, 100, _T(" ")); _stprintf_s(buffer, _T("%d"), elapsed_time); outtextxy(180, 100, buffer); } } } } // 关闭图形界面 closegraph(); return 0; } ``` 这段代码将创建一个窗口,绘制一个开始按钮,并在用户单击按钮时开始计时。当用户再次单击按钮时,停止计时,并在窗口上显示经过的时间。在这个示例中,我们使用了clock()函数来计算时间,使用outtextxy()函数来在窗口上绘制文本,使用_stprintf_s()函数来将整数转换为字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leο

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值