Winapi 在成员变量中存储设备上下文,而不是在每次执行OnPaint时获取/释放它
我有一个对话框类,用于存储窗口对象:Winapi 在成员变量中存储设备上下文,而不是在每次执行OnPaint时获取/释放它,winapi,mfc,gdi,Winapi,Mfc,Gdi,我有一个对话框类,用于存储窗口对象: class CInputDlg : public CDialog { ... private: CWnd m_cImageWindow; ... }; void CInputDlg::OnPaint() { CPaintDC dc(this); if (IsIconic()) { ... } else { CDC* pDC = m_cImageWindow.G
class CInputDlg : public CDialog
{
...
private:
CWnd m_cImageWindow;
...
};
void CInputDlg::OnPaint()
{
CPaintDC dc(this);
if (IsIconic())
{
...
}
else
{
CDC* pDC = m_cImageWindow.GetDC();
CDC cDC;
cDC.CreateCompatibleDC(pDC);
cDC.SelectObject(m_hImageBitmap);
pDC->StretchBlt(...,...,...,...,&cDC,...,...,...,...,SRCCOPY);
cDC.DeleteDC();
m_cImageWindow.ReleaseDC(pDC);
}
}
在对话框classOnPaint
例程中,我在窗口对象中绘制:
class CInputDlg : public CDialog
{
...
private:
CWnd m_cImageWindow;
...
};
void CInputDlg::OnPaint()
{
CPaintDC dc(this);
if (IsIconic())
{
...
}
else
{
CDC* pDC = m_cImageWindow.GetDC();
CDC cDC;
cDC.CreateCompatibleDC(pDC);
cDC.SelectObject(m_hImageBitmap);
pDC->StretchBlt(...,...,...,...,&cDC,...,...,...,...,SRCCOPY);
cDC.DeleteDC();
m_cImageWindow.ReleaseDC(pDC);
}
}
与每次执行OnPaint
例程时获取/释放和创建/删除这两个设备上下文不同,我希望将它们存储为dialog类的成员变量,并在OnInitDialog
例程中初始化它们一次
但表示“应用程序只有在必须在客户端区域绘制时才能获得显示DC,并且当应用程序完成绘制时,必须释放DC”
我还读到,当一个进程分配一个DC时,它会影响系统中的其他进程,因为可以同时获取的DC数量是有限的
所以我的问题是:
DeleteDC
和ReleaseDC
,也会说“未检测到内存泄漏”。我可以假设在销毁相应实例的过程中会自动发生这种情况吗谢谢。您只需要在内存中创建一次兼容的DC,而不是在每一个油漆上。并保存它。当您处理
WP_PAINT
时,您无论如何都需要调用BeginPaint
直接或间接。此呼叫返回显示窗口的DC。所以-不保存显示DC,但创建一次并保存兼容DC,在绘制时只需通过BitBland将兼容DC复制到显示,视觉泄漏检测器仅检测堆中的泄漏,而不检测GDI对象leaks@RbMm:对于您的第一条评论:如果我不能调用m_pDC=m_cImageWindow.GetDC()
一次,那么我就不能调用m_cDC.CreateCompatibleDC(m_pDC)`一次。如果我理解正确,那么您建议执行后一次,但每次执行OnPaint
@RbMm时都执行前一次。第二个评论:我为什么要关心任何其他泄漏?应用程序中的每个实例都被销毁后,这些泄漏不会立即消失吗?如果这是您唯一关心的问题,那么您应该这样做我也不关心内存泄漏。一旦进程终止,这些泄漏也会消失。