win7 vc2008 vc1.在调试环境下(debug release)均不出现泄漏情况2.但是当我把release后的exe单独运行时出项泄露已查明泄露位置(保证):
int i=::DeleteDC(m_hdcBottom);//调试环境中i=1;成功 HDC hDC = ::GetDC(NULL); m_hdcBottom=::CreateCompatibleDC(hDC);//m_hdcBottom为全局hdc ,必须为全局难道1,2情况是调用的是不同的库,一个是系统的,一个是vc带的,不明白如何解决呢
int i=::DeleteDC(m_hdcBottom);//调试环境中i=1;成功 HDC hDC = ::GetDC(NULL); m_hdcBottom=::CreateCompatibleDC(hDC);//m_hdcBottom为全局hdc ,必须为全局难道1,2情况是调用的是不同的库,一个是系统的,一个是vc带的,不明白如何解决呢
在IDE中运行和单独运行的主要差别有两点:
1、进程的“当前目录”不同,由此可能导致程序使用相对路径找不到某些文件。
2、进程的权限不同,在IDE中运行是继承了VS进程的权限,比单独运行的权限高一些,某些需要特殊权限才能执行的操作在单独运行时会失败。
{
//-------------------------------------- 防止 刷新冲突
if( m_bIsRefreshing )
return;
m_bIsRefreshing = TRUE; ::SelectObject(m_hdcBottom, m_bmpBottomOld);
::SelectObject(m_hdcMask, m_hbmpMaskOld); //-------------删除m_hbmpMem
// ::DeleteObject(m_hbmpMask);
// ::DeleteObject(m_bmpBottom);// ::DeleteDC(m_hdcBottom);
// ::DeleteDC(m_hdcMask); HDC hDC = ::GetDC(NULL);// m_hdcMask = ::CreateCompatibleDC(hDC);
// m_hdcBottom=::CreateCompatibleDC(hDC);
m_bmpBottom=CreateCompatibleBitmap(hDC,m_szWin.cx,m_szWin.cy);
m_hbmpMask=CreateCompatibleBitmap(hDC,m_szWin.cx,m_szWin.cy);
::ReleaseDC(0,hDC); //------------- 文字path
FontFamily fontFamily( g_strFont.AllocSysString() );
StringFormat strformat;
strformat.SetAlignment(StringAlignmentCenter );
strformat.SetFormatFlags(StringFormatFlagsLineLimit );
GraphicsPath path;
path.AddString( m_lyric[m_nCurrentLine].strLyric.AllocSysString(),
wcslen(m_lyric[m_nCurrentLine].strLyric.AllocSysString()),
&fontFamily,
FontStyleRegular,
g_FontSize ,
RectF( 2 , 2 , m_szWin.cx-4 ,m_szWin.cy-4 ) ,
&strformat );
//------------- 边框
Pen penOut(Color(g_rgbBorderColor.Red,g_rgbBorderColor.Green,g_rgbBorderColor.Blue), 2);
// penOut.SetLineJoin( LineJoinRound );//最好有
//-------------------------------------- 开始绘制背景HDC m_hdcBottom// m_bmpBottom = ::CreateDIBSection(NULL, (PBITMAPINFO)&m_stBmpInfoHeader, DIB_RGB_COLORS, NULL , NULL, 0); m_nLeftPos=m_szWin.cx/2.0-m_lyric[m_nCurrentLine].strLyric.GetAllocLength ()*g_FontSize/4.0;
if(m_bmpBottom)
{
//------------- 开始绘制
m_bmpBottomOld = (HBITMAP)::SelectObject( m_hdcBottom, m_bmpBottom);
Graphics graphics(m_hdcBottom);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
//------------- 背景
graphics.DrawImage( m_pImage, 0, 0, m_szWin.cx, m_szWin.cy);
//------------- 边框
graphics.DrawPath(&penOut, &path);
//------------- 阴影
for(int i=1; i<5; ++i)
{
Pen pen( Color( g_rgbTextShadow.Alpha,g_rgbTextShadow.Red,g_rgbTextShadow.Green,g_rgbTextShadow.Blue ), 2*i );
pen.SetLineJoin( LineJoinRound );
graphics.DrawPath(&pen, &path);
}
//------------- 填充
SolidBrush brush( Color( g_rgbTextFill.Red ,g_rgbTextFill.Green , g_rgbTextFill.Blue ) );
path.SetFillMode(FillModeWinding);
graphics.FillPath(&brush, &path);
}
//-------------------------------------- 开始绘制蒙板HDC m_hdcMask
//-------------
// m_hbmpMask= ::CreateDIBSection(NULL, (PBITMAPINFO)&m_stBmpInfoHeader, DIB_RGB_COLORS, NULL, NULL, 0);
if(m_hbmpMask)
{
//------------- 开始绘制
m_hbmpMaskOld = (HBITMAP)::SelectObject( m_hdcMask, m_hbmpMask);
Graphics graphics(m_hdcMask);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
//------------- 背景
graphics.DrawImage( m_pImage, 0, 0, m_szWin.cx, m_szWin.cy);
//------------- 边框
graphics.DrawPath(&penOut, &path);
//------------- 阴影
for(int i=1; i<5; ++i)
{
Pen pen( Color( g_rgbMaskTextShadow.Alpha,g_rgbMaskTextShadow.Red,g_rgbMaskTextShadow.Green,g_rgbMaskTextShadow.Blue ), 2*i );
pen.SetLineJoin( LineJoinRound );
graphics.DrawPath(&pen, &path);
}
//------------- 填充
SolidBrush brush( Color( g_rgbMaskTextFill.Red ,g_rgbMaskTextFill.Green , g_rgbMaskTextFill.Blue ) );
path.SetFillMode(FillModeWinding);
graphics.FillPath(&brush, &path);
} m_bIsRefreshing = FALSE;
}
也就是你只能CDC* pDC = GetDC ,而不能CDC dc = *(GetDC());
而你所获得的这个pdc也只在当前函数中有效... 你可以试试给视图添加个成员变量 CDC* m_dc = GetDC
在另1个函数里使用m_dc会出问题...
CreateCompatibleDC 不调用DeleteDC 也不会内存泄露.