Windows GDI+库中Pen类有个函数GetBrush(),可以通过Pen类方便的生成Brush类对象。
按照MSDN中的代码
VOID Example_GetBrush(HDC hdc)
{
Graphics graphics(hdc);
HatchBrush hatchBrush(
HatchStyleVertical,
Color(255, 255, 0, 0), // red
Color(255, 0, 0, 255)); // blue
// Create a pen based on a hatch brush, and use that pen
// to draw a line.
Pen pen(&hatchBrush, 15);
graphics.DrawLine(&pen, 0, 0, 200, 100);
// Get the pen's brush, and use that brush to fill a rectangle.
Brush* pBrush = pen.GetBrush();
graphics.FillRectangle(pBrush, 0, 100, 200, 100);
}
似乎GetBrush()返回的Brush对象不需要手动删除.
在实际运用中(代码逻辑结构如下),发现对同一pen对象多次调用GetBrush()方法获得的指针不同,即对应多个Brush。
Gdiplus::Pen* lpPen = ::new Gdiplus::Pen(Gdiplus::Color(argb),width);
for(int i = 0; i < 1000; i++)
{
...
Brush* lpBrush = lpPen->GetBrush();
...
}
delete lpPen;
即使pen对象已经被释放,但是这部分空间还未被释放,造成应用程序消耗内存越来越多。
也许由于GDI+库的内存独立管理,或者在应用程序关闭时,库会释放所有创建的Brush对象。在应用程序使用MFC自带的内存检查未发现内存泄露现象,从任务管理器中看到内存的使用量逐步升高。
因此在实际使用中将上述结构的代码改成,如下结构:
Gdiplus::Pen* lpPen = ::new Gdiplus::Pen(Gdiplus::Color(argb),width);
for(int i = 0; i < 1000; i++)
{
...
Brush* lpBrush = lpPen->GetBrush();
...
delete lpBrush;
...
}
delete lpPen;