ad

为何徘徊在静态Win32控制中会增加记忆并删除我的GUI?-英雄云拓展知识分享

匿名投稿 211 2024-01-22

如果没法正确处理,Windows API资源可能会致使内存泄漏。不管是在这个问题上,我是不是都这样,我假定它是相干的。虽然我展现了如何将问题固定在问题所在的地方,但我没法解决问题。

我使用Win32 API有两类类型的静态类控件,这在我的课程中被抽象出来:

Label

LinkLabel 

问题:每当我添加这两个控件时,Visual Studio 2017的诊断工具将显示进程内存(MB)从3MB增加到11MB,当我启用了SetFont()或SethoverColor()线路时,我的GUI空间中的所有内容都会消失 - - 像一些著名的书店一样从存在中消失。

此代码很好(3MB在进程内存中保持相同的常数速率):

 // Linked Label

为何徘徊在静态Win32控制中会增加记忆并删除我的GUI?-英雄云拓展知识分享

myLinkLabel.init("http://www.google.com", 50, 450);

myLinkLabel.setColor(0, 0, 255);

myLinkLabel.onClick(lbl_Click);

myLinkLabel.setFont("Arial", 40, true);

//lbl.setHoverColor(255, 0, 0); 

// label

myLabel.init("A regular static label", 0, 0);

myLabel.setColor(0, 255, 0);

myLabel.setFont("Arial", 40);

//myLabel.setHoverColor(255, 0, 0);

下一个代码绝不符号最后一行。悬停在Mylabel上并出现红色突出色彩后,Process Memory的3MB增加到7MB+。它坐了一点,然后到达9MB+。因此,这种情况下,其中有问题。 

// Linked Label

myLinkLabel.init("http://www.google.com", 50, 450);

myLinkLabel.setColor(0, 0, 255);

myLinkLabel.onClick(lbl_Click);

myLinkLabel.setFont("Arial", 40, true);

//lbl.setHoverColor(255, 0, 0); 

// label

myLabel.init("A regular static label", 0, 0);

myLabel.setColor(0, 255, 0);

myLabel.setFont("Arial", 48);

myLabel.setHoverColor(255, 0, 0);

因此,这种情况下,让我们深入研究我的SethoverColor():

void Label::setHoverColor(const BYTE red, const BYTE blue, const BYTE green)

{

 m_hoverColorEnabled = true;

 m_hoverColor = RGB(red, green, blue);

}

好的,上面的代码中没有甚么太惊人的了。这告知我看wndproc。 

该静态控制使用的事件是WM_SETCURSOR。 

 case WM_SETCURSOR:

{

HWND m_handle = (HWND)wParam;

// Label

for (int i = 0; i < frm.getLabelControlCount(); i++)

{

if (frm.getLabelControl(i).getHandle() == m_handle)

{

if (frm.getLinkLabelControl(i).isLink())

{

// Set hover color to link 

if (frm.getLabelControl(i).isHoverColorEnabled())

frm.getLabelControl(i).setColor(frm.getLabelControl(i).getHoverColor());

// Update cursor to hand

SetClassLongPtr(frm.getLabelControl(i).getHandle(), GCLP_HCURSOR, (LONG_PTR)frm.getLabelControl(i).getHoverCursor());

}

}

else

{

// Set link to blue and use default arrow 

if (frm.getLabelControl(i).isHoverColorEnabled())

frm.getLabelControl(i).setColor(0, 0, 255);

SetClassLongPtr(frm.getLabelControl(i).getHandle(), GCLP_HCURSOR,

(LONG_PTR)LoadCursor(NULL, IDC_ARROW));

}

}

&nbsp;在评论这一代码时,进程内存保持不变在3MB。在删除本节时,进程内存会增加。因此,这种情况下,这是明显引发问题的主要代码。&nbsp;

这部份代码基本上是针对当前鼠标悬停状态更新标签的文本色彩。当不徘徊时,它是蓝色的,当徘徊时,它是红色的。

setColor()是以下代码:

void Label::setColor(const COLORREF color)

{

 m_foreColor = color;

 setFont(m_fontName, m_fontSize, m_bold, m_italic, m_underlined);

}

这也调用setfont()以更新:

bool Label::setFont(const std::string &fontName, const int size, const bool bold,

 const bool italic, const bool underlined)

 DWORD dwItalic;

 DWORD dwBold;

 DWORD dwUnderlined;

 SIZE linkSize;

 dwItalic = (italic) ? TRUE : FALSE;

 dwBold = (bold) ? FW_BOLD : FW_DONTCARE;

 dwUnderlined = (underlined) ? TRUE : FALSE;

 m_font = CreateFont(size, 0, 0, 0, dwBold, dwItalic, dwUnderlined, FALSE,

  ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,

  DEFAULT_PITCH | FF_SWISS, fontName.c_str());

 SendMESsage(m_handle, WM_SETFONT, WPARAM(m_font), TRUE);

 

 // Calculate the correct width and height size 

 HDC hDC = GetDC(m_handle);

 SelectFont(hDC, m_font);

 GetTextExtentPoint32(hDC, m_text.c_str(), (int) m_text.length(), &linkSize);

 setSize(linkSize.cx, size); 

 

 // Store font information

 m_fontName = fontName;

 m_fontSize = size;

 m_bold = bold;

 m_underlined = underlined;

 m_italic = italic;

 

 return true;

}

我的猜想是,这是针对创建字体并针对每一个悬停进行重新创建的更新。我的理由是,除非再次设置字体,否则不会更新字体色彩。虽然我在不久的将来看到了这个空间,但我是不是忘记了在这里删除资源或其他内容?任何想法都遭到欢迎。可以肯定的是,这也能够解决linklabel。

看答案

您的基本问题是,您不断生成新字体,并且永久不会发布旧字体。

每次SetFont都称为您分配并选择新字体。但是,当您将新字体选择到HDC中时,您永久不会清算旧字体。

SelectFont返回您需要的先前选择的字体(除非是库存字体)可以在deletefont上进行。

另外,您在GETDC调用中有更大的资源泄漏 - GETDC的MS文档建议您在完成使用时使用reparec。

据我所知,不需要重置字体来重置色彩。


🚀🌟 点击注册 免费试用超级应用平台-英雄云企业级hpaPaaS 🌟🚀 😃👉🌐

免责声明:

本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。

标签:C ++ Winapi
上一篇:系统上的config.xml与jenkins UI不同-英雄云拓展知识分享
下一篇:如果其他使用python列表理解嵌套循环-英雄云拓展知识分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×