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格式)