【发布时间】:2016-05-10 11:12:58
【问题描述】:
我使用 MFC 实现了一个简单的游戏。它包含图像和格式化的文本。在测试时,我发现程序运行大约 7 分钟后没有问题,之后图像消失并且文本格式重置。为了确定问题,我重写了一个非常基本的版本,它只显示格式化的文本。但是问题仍然存在,我已经用谷歌搜索了一天,但问题仍然存在。这是我的 OnPaint 方法
CPaintDC dc(this);
CRect clientRect;
GetClientRect(&clientRect);
CDC bitmapDC;
bitmapDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, clientRect.Width(), clientRect.Height());
bitmapDC.SelectObject(&bitmap);
CBrush backgroundBrush;
backgroundBrush.CreateSolidBrush(RGB(0xf8, 0xf8, 0xf8));
bitmapDC.FillRect(&clientRect, &backgroundBrush);
int SavedDc = bitmapDC.SaveDC();
long nHeight = -MulDiv(20, GetDeviceCaps(bitmapDC, LOGPIXELSY), 72);
HFONT myfont = CreateFont(nHeight, 0, 0, 0, FW_ULTRALIGHT, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, TEXT("Arial"));
bitmapDC.SelectObject(myfont);
SetBkMode(bitmapDC, TRANSPARENT);
bitmapDC.DrawText(L"This shouldn't happen", &clientRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
dc.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &bitmapDC, 0, 0, SRCCOPY);
bitmapDC.RestoreDC(SavedDc);
backgroundBrush.DeleteObject();
bitmap.DeleteObject();
bitmapDC.DeleteDC();
我可以看到 Visual Studio 中的内存使用量逐渐增加。如果我注释掉 DrawText 部分,它就不会再增加了。难道我做错了什么?如何防止 DrawText 方法增加内存使用量?我也用图像测试过,这是同样的问题。我应该以某种方式释放或删除 DrawText 吗?任何帮助将不胜感激。
【问题讨论】:
-
你没有删除我的字体。
-
@JonathanPotter 你是对的,阻止了增长。只是一个后续问题,如果我想绘制图像,删除 CImage 对象是否也足够?我刚刚对其进行了测试,仅删除 CImage 并不能阻止增加。非常感谢您的帮助。
-
我在任何地方都看不到 CImage。
-
@JonathanPotter 我已将其注释掉以测试相同的事情是否仅发生在文本中。
标签: c++ winapi visual-c++ memory mfc