C++使用GDI+进行简单绘图与擦除

C++使用GDI+进行简单绘图与擦除

绘图主要是捕捉鼠标下落与升起事件,文中应用的是Duilib库进行界面编程的,对应的也就是WM_LBUTTONDOWN和WM_LBUTTONUP消息事件,画图的主要实现是开启一个线程,一直循环去捕捉用户的WM_LBUTTONDOWN和WM_LBUTTONUP事件,遇到WM_LBUTTONDOWN事件时,运用GetMousePos()函数或GetCursorPos()函数去获取用户点击的点,获取两个点之后就能利用DrawCurve()函数使用Pen类new一个有色值的笔出来进行曲线绘制,橡皮擦的实现使用FillRectangle()函数使用SolidBrush类new一个背景色值的画刷出来进行区域擦除。遇到WM_LBUTTONUP事件时,跳出循环进行递归下次循环。

绘图之前需要先初始化GDI+

// 初始化GDI+.
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR m_gdiplusToken;
GdiplusStartup((ULONG_PTR)&m_gdiplusToken, &gdiplusStartupInput, NULL);

//绘制自定义界面
.......

 Graphics* graphics = new Graphics(m_pHwnd);//根据自定义界面的窗口句柄在窗口初始化函数里new一个graphics
 
 delete graphics;//在窗口销毁函数里记得delete,不然会造成内存泄漏

绘图代码实现如下:

unsigned __stdcall OnPaint(LPVOID lpParam)
{
	while (!m_isPainting)
	{ 
		Sleep(10);
	}
	
	Pen pen(Color(255, 123, 456, 789));
	SolidBrush *Brush = new SolidBrush(Color(255, 255, 255, 255));

	while (m_isPainting)
	{
		GetCursorPos(&p2);
		//POINT p2 = m_pm.GetMousePos();
		if (rect.PtInRect(p2))
		{
			if (p1.x == 0 && p1.y == 0)  //第一个点不足以绘制曲线,需要等待捕捉倒第二个点再进行曲线绘制
			{
				p1 = p2;
				continue;
			}
			
			if (m_isDrawing)  //绘图
			{
				Point curPoints[2] = { { p1.x, p1.y }, { p2.x, p2.y } };
				graphics->DrawCurve(&pen, curPoints, 2);
			}
			else  //橡皮擦,背景色为白色,橡皮擦大小是点周围的10px
			{
				int x = (p1.x + p2.x) / 2 - 5;
				int y = (p1.y + p2.y) / 2 -5;
				int width = 10;
				int height = 10;
				graphics->FillRectangle(Brush, x, y, width, height);
			}
			p1 = p2;
		}
	}
	delete Brush;
	
	if (isRunning)  //程序还在运行时进行递归操作
	{
		OnPaint(NULL);
	}
}

将绘制的图案保存为图片的代码如下(采取屏幕截图方式,图片保存为 png格式)


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值