简介及相关资料:
问题的前标题:
窗口在调整大小时会产生类似闪烁(慢速重绘)的效果
我有一个复杂的绘画要在我的主窗口的WM_PAINT
处理程序中实现。我已经提交了一张图片波纹管。
标有 1 和 2 的徽标是使用 绘制的GDI+
。标记为 1 的metafile
徽标是 ,标记为 2 的徽标是PNG
。
如果我省略了第二个标志的绘制,我的窗口不会闪烁,但是如果我在我的 中添加第二个标志的绘制WM_PAINT
,就会出现以下效果,如下图所示(这只是在 Paint 中制作的草图,但希望它会澄清事情):
好像重绘很慢。
重要提示:此效果发生在子窗口上,背景绘制正确。
以防万一,有关子窗口的信息:
所有 5 个子窗口都是静态控件。
带有蓝色渐变的静态控件使用双缓冲绘制,使用GDI
, in WM_CTLCOLORSTATIC
。
橙色静控是subclassed
,而且是ownerdrawn
。
重要提示:我必须说这是我第一次使用GDI+
.
在我的WM_PAINT
处理程序中,我制作了双缓冲所需的兼容内存 DC,如下所示:
HDC hdc = BeginPaint( hwnd, &ps), hdcMemImg, MemDC;
MemDC = CreateCompatibleDC(hdc); // back buffer.
兼容位图具有主窗口客户区的尺寸。
正如我所说,一切似乎都很好,因为我使用GDI
双缓冲来绘画/绘图。
当我需要绘制标有 1 和 2 的徽标时,我会使用以下代码:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
Image image(L".\\resources\\BG.emf"), image1(L".\\resources\\RGF.png");
switch(msg)
{
case WM_ERASEBKGND:
return (LRESULT)1;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hwnd, &ps), hdcMemImg, MemDC;
MemDC = CreateCompatibleDC(hdc); // back buffer.
// CreateCompatibleBitmap and other usual stuff
/******************** left logo *******************/
Graphics graphics( MemDC );
//============= aspect ratio ================//
UINT o_height = image.GetHeight(),
o_width = image.GetWidth();
INT n_width = 80;
INT n_height = 100;
double ratio = ( (double)o_width ) / ( (double)o_height );
if (o_width > o_height)
{
// Resize down by width
n_height = static_cast<UINT>( ( (double)n_width ) / ratio );
}
else
n_width = static_cast<UINT>(n_height * ratio);
//========== ensure high graphic quality ======================//
graphics.SetSmoothingMode( SmoothingModeHighQuality );
graphics.SetInterpolationMode( InterpolationModeHighQualityBicubic );
graphics.DrawImage( &image, r.left + 5, r.top + 10, n_width, n_height );
/******************** right logo *******************/
Graphics graphics1( MemDC );
//============= aspect ratio ================//
o_height = image1.GetHeight(),
o_width = image1.GetWidth();
n_width = 90;
n_height = 100;
ratio = ( (double)o_width ) / ( (double)o_height );
if (o_width > o_height)
{
// Resize down by width
n_height = static_cast<UINT>( ( (double)n_width ) / ratio );
}
else
n_width = static_cast<UINT>(n_height * ratio);
//=========== ensure high graphic quality ============//
graphics1.SetSmoothingMode( SmoothingModeHighQuality );
graphics1.SetInterpolationMode( InterpolationModeHighQualityBicubic );
graphics1.DrawImage( &image1, r.right - r.left - 90, r.top + 10, n_width, n_height );
// Then do BitBlt of MeDC to hdc, and clean it up
如果需要额外的代码片段,请询问,我将编辑我的帖子,但现在,它们被省略以保持帖子的简短和简洁。
我在 Windows XP 上工作,使用 MS Visual Studio C++ 和纯 Win32 API。
我的 CPU 是单核 (2,67 GHz),我有 768 MB 的 RAM。
重要更新:
当我打开时Task Manager
,我可以看到我的应用程序的内存消耗猛增。
它永远不会下降,它总是会增长,尤其是当我调整窗口大小时。
可以在下面找到我为解决这个问题所做的努力的详细描述。
我决定听取更有经验和更好的开发人员的建议,并将提供演示项目的链接。
注意:由于 VS 的 Express 版没有资源编辑器,因此资源文件和资源头是使用ResEdit
从这里http://www.resedit.net/创建的。
这是演示项目的链接(所有必要的评论和解释都在项目评论中):http ://www.uploadmb.com/dw.php?id=1382012579 。
我为解决问题所做的努力:
通过 Internet、SO 存档、CodeProject 和 CodeGuru 浏览,我无法看到问题所在 - 似乎(我也相信)双缓冲的原理GDI+
是GDI
相同的。
重要更新:
我已经VLD
从http://vld.codeplex.com/下载,按照他们的说明进行操作,但VLD
没有检测到任何内存泄漏。
另外,我已经制作了项目的副本并删除了静态控件,只留下了窗口的背景以方便我的调试。
上面描述的内存消耗仍然会发生。
它似乎只有在我不绘制徽标时才会停止。
问题:
由于这是我第一次使用,鉴于释放/删除某些对象或类似的东西(所有用于绘制的代码都已提交)GDI+
,我是否缺少某些东西?GDI+
GDI+
WM_PAINT
同样,我相信我的其他绘画代码效果很好,但如果需要,我会发布它。
更新:
关于上面提供的更新,我应该如何解决上面描述的内存消耗过多的问题?
有人可以查看上面提供的小型演示项目,并尝试给我有用的建议吗?
谢谢你。
问候。