C++基础语言熟悉---简单画板绘制

C++基础语言熟悉—简单画板绘制
*介绍
学一门语言最好的方法就是通过各种项目实战来巩固基础语法,使之烂熟于指尖!
小白第一次模仿创作,如有错误及更好的补充还请各位不吝赐教!

代码分析

1.创建窗口
2.画板操作(坐标获取 执行操作)
3.按钮操作(功能栏设计)

效果展示

在这里插入图片描述

/窗口设计/

class Window
{
private:
	int _width;
	int _height;
public:
	Window(int w, int h, int flag = 0) :_width(w), _height(h) 
	{
		initgraph(w, h, flag);
	};
	/*返回窗口状态*/
	int exec() 
	{
		return system("pause");
	}
	~Window()
	{
		closegraph();
	}
public:
	 **/*设计窗口标题*/**
	void setTitle(const char* title)		
	{
		SetWindowText(GetHWnd(), title); 
		/*GetHwan为获得窗口句柄*/
	}

	/*获取窗口的高度以及宽度*/
	static int GetWidth() { return getwidth(); }
	static int GetHeight() { return getheight(); }

};

/坐标获取/

class GetCoordinate
{
public:
	GetCoordinate() {};
	GetCoordinate(int x, int y) :x(x), y(y) {};
	int x;
	int y;

	static GetCoordinate ZERO;
};
GetCoordinate GetCoordinate::ZERO = GetCoordinate(0, 0);

/画笔操作/

class Paint
{
public:
	static void drawRect(const GetCoordinate& p, int Back, int h, COLORREF color = getfillcolor())
	{
		setfillcolor(color);
		solidrectangle(p.x, p.y, p.x + Back, p.y + h);
	}
	static void drawLine(const GetCoordinate& p1, const GetCoordinate& p2, COLORREF color = getlinecolor(), int lineSize = 1)
	{
		setlinestyle(PS_COSMETIC, lineSize);
		setlinecolor(color);
		line(p1.x, p1.y, p2.x, p2.y);
	}

	static void drawText(int x, int y, const char* text, COLORREF color = gettextcolor(), int textSize = 26)
	{
		setbkmode(TRANSPARENT);
		settextcolor(color);
		settextstyle(textSize, 0, "黑体");
		outtextxy(x, y, text);
	}
	static void drawText(int x, int y, int text, COLORREF color = gettextcolor(), int textSize = 26)
	{
		char lineSizeStr[10] = "";
		sprintf_s(lineSizeStr, "%d", text);
		Paint::drawText(x, y, lineSizeStr, color, textSize);
	}
	static void drawCircle(const GetCoordinate& p, int Back, int h, COLORREF color = getfillcolor())
	{
		setfillcolor(color);
		solidellipse(p.x, p.y, p.x + Back, p.y + h);
	}
};

class Sketchpad :public Tools
{
public:
	Sketchpad() {}
	Sketchpad(int x, int y, int Back, int h)
		:Tools(x, y, Back, h), color(BLACK), lineSize(1)
	{
		this->isDown = false;
		this->begPos = GetCoordinate(0, 0);
	}
	bool ProcessMsg(MOUSEMSG& msg)
	{
		switch (msg.uMsg)
		{
		case WM_LBUTTONDOWN:
			if (isIn(GetCoordinate(msg.x, msg.y)))
			{
				isDown = true;
				begPos = GetCoordinate(msg.x, msg.y);
			}
			break;
		case WM_LBUTTONUP:
			isDown = false;
			break;
		case WM_MOUSEWHEEL:						//滚轮调整字体大小
			lineSize = msg.wheel > 0 ? lineSize + 1 : lineSize - 1;
			if (lineSize <= 0)
			{
				lineSize = 1;
			}
			break;
		case WM_MOUSEMOVE:						//画线
			if (isDown)
			{
				if (isIn(begPos) && isIn(GetCoordinate(msg.x, msg.y)))		// 起始点和结束点都在区域内
				{
					Paint::drawLine(begPos, GetCoordinate(msg.x, msg.y), color, lineSize);
				}
				begPos = GetCoordinate(msg.x, msg.y);
			}
			break;
		case WM_RBUTTONDOWN:					//清屏
			Paint::drawRect(GetCoordinate::ZERO, Window::getW() - 100, Window::getH(), WHITE);				//绘图区域
			break;
		}
		return false;
	}
public:
	int getLineSize()
	{
		return lineSize;
	}
	void setColor(COLORREF color)
	{
		this->color = color;
	}
private:
	int lineSize;	//线条宽度
	COLORREF color;	//线条颜色

	bool isDown;	//鼠标是否按下
	GetCoordinate begPos;	//记录上一个点的坐标
};

/继承基础/

class Tools
{
public:
	Tools() {};
	Tools(int x, int y, int Back, int h)
		:leftTop(x, y), width(Back), height(h)
	{
	}
	//鼠标是否在控件上
	bool isIn(const GetCoordinate& p)
	{
		if (p.x >= leftTop.x && p.x <= leftTop.x + width &&
			p.y >= leftTop.y && p.y <= leftTop.y + height)
		{
			return true;
		}
		return false;
	}

	//处理鼠标消息,需要继承自己实现
	bool ProcessMsg(MOUSEMSG& msg)
	{
		return 0;
	}

	GetCoordinate leftTop;
	int width;
	int height;
};

/功能区域设计/

class Button :public Tools
{
public:
	enum ButtonStyle { CIRCLE, RECT };
	Button() :style(ButtonStyle::CIRCLE) {}
	Button(int x, int y, int Back, int h, ButtonStyle style = ButtonStyle::CIRCLE)
		:Tools(x, y, Back, h), style(style)
	{
		isClick = false;
	}
	bool ProcessMsg(MOUSEMSG& msg, Sketchpad& Sketchpad)
	{
		switch (msg.uMsg)
		{
		case WM_LBUTTONDOWN:
			if (isIn(GetCoordinate(msg.x, msg.y)))
			{
				printf("leftTop(%d,%d)  %#X \n", leftTop.x, leftTop.y, color);
				Sketchpad.setColor(color);
				isClick = true;
			}
			break;
		case WM_LBUTTONUP:
			isClick = false;
			break;
		}
		
		if (style == ButtonStyle::CIRCLE)
		{
			Paint::drawCircle(leftTop, width, height, color);
		}
		else if (style == ButtonStyle::RECT)
		{
			Paint::drawRect(leftTop, width, height, color);
		}

		return false;
	}
public:
	void setPos(const GetCoordinate& p)
	{
		this->leftTop = p;
	}
	void setSize(int Back, int h)
	{
		this->width = Back;
		this->height = h;
	}
	void setColor(COLORREF color)
	{
		this->color = color;
	}
	void setStyle(ButtonStyle style)
	{
		this->style = style;
	}
private:
	bool isClick;	//按钮是否被点击
	COLORREF color;	//按钮颜色
	ButtonStyle style;	//按钮样式
};

/主函数/

int main()
{
	Window Back(1100, 768, EW_SHOWCONSOLE);
	Back.setWindowTitle("c++ 绘图");
	Paint::drawRect(GetCoordinate::ZERO, Back.getW(), Back.getH(), WHITE);//绘图区域				//绘图区域
	Paint::drawRect(GetCoordinate(Back.getW() - 100, 0), Back.getW(), Back.getH(), 0xEFEFEF);	//工具栏
	Sketchpad Sketchpad(0, 0, Back.getW() - 100, Back.getH());

	//颜色按钮
	Button btns[9];
	for (int i = 0; i < 9; i++)
	{
		btns[i].setSize(50, 50);
		btns[i].setPos(GetCoordinate(Window::getW() - 100 + 26, 50 + i * 60));
		btns[i].setColor(RGB(rand() % 256, rand() % 256, rand() % 256));
		//btns[i].setStyle(Button::RECT);
	}
```cpp
BeginBatchDraw();
	while (true)
	{
		MOUSEMSG msg = GetMouseMsg();
		Sketchpad.ProcessMsg(msg);   //画布,处理消息 

		Paint::drawRect(GetCoordinate(1050, 700), 50, 50, 0xEFEFEF);
		Paint::drawText(1000, 700, "字体大小:", BLACK, 15);
		Paint::drawText(1080, 700, Sketchpad.getLineSize(), BLACK, 15);
		for (int i = 0; i < 9; i++)
		{
			btns[i].ProcessMsg(msg, Sketchpad);
		}
		FlushBatchDraw();
	}

	return Back.exec();   //防止闪退 
}

> 这里是引用


	

谢谢支持!
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 在 C 语言中编写画板可以使用图形库和图形编程技术。下面是一个简单的 C 程序,它使用了图形库 `graphics.h`: ``` #include <graphics.h> #include <stdio.h> #include <conio.h> int main() { int gd = DETECT, gm; initgraph(&gd, &gm, ""); setcolor(RED); rectangle(100, 100, 200, 200); getch(); closegraph(); return 0; } ``` 这个程序使用 `initgraph` 函数初始化图形环境,然后使用 `setcolor` 函数设置图形颜色为红色,最后使用 `rectangle` 函数在屏幕上绘制一个矩形。 注意:图形库 `graphics.h` 只能在 Microsoft Visual C++ 与 Turbo C++ 中使用,不能在其他编译器中使用。如果您使用其他编译器,您可以考虑使用其他图形库或图形 API 如 OpenGL。 ### 回答2: 一个简单画板可以通过使用C语言编写。首先,我们需要引入`graphics.h`头文件,这个头文件提供了一些基本的图形函数来操作图形界面。 接下来,我们可以使用`initwindow`函数来创建一个窗口,它接受两个参数,分别是窗口的宽度和高度。例如,`initwindow(800, 600);`将创建一个宽度为800像素,高度为600像素的窗口。 然后,我们可以使用`line`函数来画直线。该函数接受四个参数,分别是线的起点坐标和终点坐标。例如,`line(100, 100, 200, 200);`将在窗口上画一条从(100, 100)到(200, 200)的直线。 除了直线,我们还可以使用`rectangle`函数画矩形,`circle`函数画圆等。 为了实现交互功能,我们可以使用`getch`函数来等待用户输入。例如,`char ch = getch();`将等待用户按下一个按键,并将按键的ASCII码保存在变量`ch`中。 我们还可以使用`getmouse`函数来获取鼠标的坐标和状态。例如,`int x, y, button; getmouse(&x, &y, &button);`将获取鼠标当前的坐标和按键状态,并保存在变量`x`,`y`和`button`中。 最后,我们可以使用`closegraph`函数来关闭图形窗口,释放资源。例如,`closegraph();`将关闭窗口并退出程序。 通过以上的基本操作,我们就可以编写一个简单画板,可以使用鼠标点击和拖动来绘制不同的图形。当然,这只是一个简单的示例,你可以根据需要进行进一步的扩展和优化。 ### 回答3: 可以使用C语言编写一个简单画板程序。 首先,需要使用C语言的图形库,如OpenGL或者SDL来创建一个画板窗口。这个窗口将会是用户绘制图形的界面。 然后,可以在程序中使用一些基本的绘图函数,如画线、画矩形、画圆等,来实现用户在画板上绘图的功能。例如,可以使用OpenGL中的glBegin(GL_LINES)和glEnd()函数来画线,使用glBegin(GL_QUADS)和glEnd()函数来画矩形,使用glBegin(GL_TRIANGLE_FAN)和glEnd()函数来画圆等。 用户可以通过鼠标或者键盘来与画板交互。例如,可以通过鼠标的点击事件来确定绘图的起点和终点,并根据这些点来调用绘图函数来绘制线条或者其他图形。如果用户希望更改绘图的颜色、线条粗细或者其他参数,可以通过键盘事件来实现。 同时,为了提供更好的用户体验,可以添加一些辅助功能,如撤销、重做、保存、导入等。通过保存功能,可以将用户绘制的图形保存为文件,或者通过导入功能可以导入图片进行涂鸦。 最后,在程序结束时,需要释放画板所占用的内存资源,并关闭画板窗口,以确保程序正常退出。 这样,一个简单画板程序就完成了。用户可以通过该程序来绘制自己想要的图形,进行创作和涂鸦。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Warm wolf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值