背景:白色,大小为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();
}