使用C ++中的特点库定义内涵全局矢量-英雄云拓展知识分享
211
2024-01-22
如果没法正确处理,Windows API资源可能会致使内存泄漏。不管是在这个问题上,我是不是都这样,我假定它是相干的。虽然我展现了如何将问题固定在问题所在的地方,但我没法解决问题。
我使用Win32 API有两类类型的静态类控件,这在我的课程中被抽象出来:
LabelLinkLabel
问题:每当我添加这两个控件时,Visual Studio 2017的诊断工具将显示进程内存(MB)从3MB增加到11MB,当我启用了SetFont()或SethoverColor()线路时,我的GUI空间中的所有内容都会消失 - - 像一些著名的书店一样从存在中消失。
此代码很好(3MB在进程内存中保持相同的常数速率):
// Linked Label![为何徘徊在静态Win32控制中会增加记忆并删除我的GUI?-英雄云拓展知识分享 为何徘徊在静态Win32控制中会增加记忆并删除我的GUI?-英雄云拓展知识分享](https://www.yingxiongyun.com/news/zb_users/cache/ly_autoimg/m/MTMyNjI.pjp)
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 LabelmyLinkLabel.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。
据我所知,不需要重置字体来重置色彩。
免责声明:
本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。
发表评论
暂时没有评论,来抢沙发吧~