有一个内存泄露的问题,窗口切换多次后泄露,窗口里面含自绘图片按钮 问题如题: 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网友们帮我看看啊,我实在找不出来了代码如下:void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CString sCaption; HDC h_clientDC; CRect rect; CDC *pDC; h_clientDC = lpDrawItemStruct->hDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); GetWindowText(sCaption); rect = lpDrawItemStruct->rcItem; pDC->SetBkMode(TRANSPARENT); PaintButton(lpDrawItemStruct->hDC); }HBITMAP MyButton::LoadImagFile(CString strFileName){ IImagingFactory *pImgFactory =NULL; IImage *pImage =NULL; CoInitializeEx(NULL,COINIT_MULTITHREADED); HBITMAP hResult =0; if (SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **)&pImgFactory))) { ImageInfo imageInfo; if(SUCCEEDED(pImgFactory->CreateImageFromFile(strFileName,&pImage)) && SUCCEEDED(pImage->GetImageInfo(&imageInfo))) { CWindowDC dc(0); CDC dcBitmap; dcBitmap.CreateCompatibleDC(&dc); hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height); if(hResult){ HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult); pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL); dcBitmap.SelectObject(hOldBitmap); } pImage->Release(); } pImgFactory->Release(); } //释放资源 if(pImage != NULL) { pImage->Release(); pImage = NULL; } if(pImgFactory != NULL) { pImgFactory->Release(); pImgFactory = NULL; } CoUninitialize(); return hResult;}void MyButton::PaintButton(HDC h_destDC){ CRect cltRect; BITMAP bmp; HDC hDC; HBITMAP jpgbmp; if(BUTTON_STATE==BUTTON_DOWN) { jpgbmp = LoadImagFile(m_strdown); } else if(BUTTON_STATE==BUTTON_UP) { jpgbmp = LoadImagFile(m_strup); } ::GetObject(jpgbmp, sizeof(bmp), &bmp); hDC = ::CreateCompatibleDC(NULL); SelectObject(hDC, jpgbmp); ::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(), hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255)); ::DeleteObject(jpgbmp); ::DeleteDC(hDC);}void MyButton::OnLButtonUp(UINT nFlags, CPoint point) { BUTTON_STATE=BUTTON_UP; CButton::OnLButtonUp(nFlags, point);}void MyButton::OnLButtonDown(UINT nFlags, CPoint point) { BUTTON_STATE=BUTTON_DOWN; CButton::OnLButtonDown(nFlags, point);} 窗口切换多次后引发错误,很有可能是在切换一个窗口后,在另一个窗口状态下你还在调用先前窗口的指针;或者是你先NEW了一个窗口指针,但是当再次切换到该窗口时,又再次NEW了次,这样就会出问题了。所以建议你检查下窗口指针的处理情况 其实不长,重点的代码就只有这个,帮我看看void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {CString sCaption;HDC h_clientDC;CRect rect;CDC *pDC;h_clientDC = lpDrawItemStruct->hDC;pDC = CDC::FromHandle(lpDrawItemStruct->hDC);GetWindowText(sCaption);rect = lpDrawItemStruct->rcItem;pDC->SetBkMode(TRANSPARENT);PaintButton(lpDrawItemStruct->hDC);}void MyButton::PaintButton(HDC h_destDC){CRect cltRect;BITMAP bmp;HDC hDC;HBITMAP jpgbmp;if(BUTTON_STATE==BUTTON_DOWN){jpgbmp = LoadImagFile(m_strdown);}else if(BUTTON_STATE==BUTTON_UP){jpgbmp = LoadImagFile(m_strup);}::GetObject(jpgbmp, sizeof(bmp), &bmp);hDC = ::CreateCompatibleDC(NULL);SelectObject(hDC, jpgbmp);::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(), hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));::DeleteObject(jpgbmp);::DeleteDC(hDC);} CWindowDC dc(0); CDC dcBitmap; dcBitmap.CreateCompatibleDC(&dc); 这个需要释放 dcBitmap.Delete(); hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height); if(hResult){ HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult); pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL); dcBitmap.SelectObject(hOldBitmap); HBITMAP oldBmp = SelectObject(hDC, jpgbmp);::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(), hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));SelectObject(hDC, oldBmp);::DeleteObject(jpgbmp);::DeleteDC(hDC); CDC dcBitmap; dcBitmap.CreateCompatibleDC(&dc); hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);// hResult 需要释放 DeleteObject(hResult) ; if(hResult){ HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult); pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL); dcBitmap.SelectObject(hOldBitmap); 为什么释放hostent *报错 Visual Studio 2010 打开大项目很卡 怎么解决? 截屏,要把滚动条未显示部分也截下来,但总是出错,麻烦帮忙看看 如何获取本机的网关IP地址? 请问组合框中直接输入文字而不从列表中选择,怎么把输入的几个字符赋给另一个变量? 在学习过程中写的一个dll,怎么都无法通过rundll32调用其中函数? ODBC做一个管道程序,即将一个数据库中数据倒入另外一个数据库,求教 怎样重用一个线程 求购仿真器或编程器!!!! 程序员具备的素质 VC如何实现多屏显示 怎么可以用VC6或者VS2010生成一个安装程序,想把一些配置脚本和程序一把给安装了。谢谢
代码如下:void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{ CString sCaption;
HDC h_clientDC;
CRect rect;
CDC *pDC; h_clientDC = lpDrawItemStruct->hDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
GetWindowText(sCaption);
rect = lpDrawItemStruct->rcItem;
pDC->SetBkMode(TRANSPARENT); PaintButton(lpDrawItemStruct->hDC);
}
HBITMAP MyButton::LoadImagFile(CString strFileName)
{
IImagingFactory *pImgFactory =NULL;
IImage *pImage =NULL;
CoInitializeEx(NULL,COINIT_MULTITHREADED);
HBITMAP hResult =0;
if (SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
ImageInfo imageInfo;
if(SUCCEEDED(pImgFactory->CreateImageFromFile(strFileName,&pImage))
&& SUCCEEDED(pImage->GetImageInfo(&imageInfo)))
{
CWindowDC dc(0);
CDC dcBitmap;
dcBitmap.CreateCompatibleDC(&dc);
hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);
if(hResult){
HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult);
pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL);
dcBitmap.SelectObject(hOldBitmap);
}
pImage->Release();
}
pImgFactory->Release();
}
//释放资源
if(pImage != NULL)
{
pImage->Release();
pImage = NULL;
} if(pImgFactory != NULL)
{
pImgFactory->Release();
pImgFactory = NULL;
}
CoUninitialize();
return hResult;
}
void MyButton::PaintButton(HDC h_destDC)
{
CRect cltRect;
BITMAP bmp;
HDC hDC; HBITMAP jpgbmp; if(BUTTON_STATE==BUTTON_DOWN)
{
jpgbmp = LoadImagFile(m_strdown);
}
else if(BUTTON_STATE==BUTTON_UP)
{
jpgbmp = LoadImagFile(m_strup);
} ::GetObject(jpgbmp, sizeof(bmp), &bmp);
hDC = ::CreateCompatibleDC(NULL);
SelectObject(hDC, jpgbmp);
::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(),
hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));
::DeleteObject(jpgbmp);
::DeleteDC(hDC);}void MyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
BUTTON_STATE=BUTTON_UP;
CButton::OnLButtonUp(nFlags, point);
}
void MyButton::OnLButtonDown(UINT nFlags, CPoint point)
{ BUTTON_STATE=BUTTON_DOWN; CButton::OnLButtonDown(nFlags, point);
}
或者是你先NEW了一个窗口指针,但是当再次切换到该窗口时,又再次NEW了次,这样就会出问题了。
所以建议你检查下窗口指针的处理情况
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CString sCaption;
HDC h_clientDC;
CRect rect;
CDC *pDC;
h_clientDC = lpDrawItemStruct->hDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
GetWindowText(sCaption);
rect = lpDrawItemStruct->rcItem;
pDC->SetBkMode(TRANSPARENT);
PaintButton(lpDrawItemStruct->hDC);
}void MyButton::PaintButton(HDC h_destDC)
{
CRect cltRect;
BITMAP bmp;
HDC hDC;
HBITMAP jpgbmp;
if(BUTTON_STATE==BUTTON_DOWN)
{jpgbmp = LoadImagFile(m_strdown);}
else if(BUTTON_STATE==BUTTON_UP)
{jpgbmp = LoadImagFile(m_strup);}
::GetObject(jpgbmp, sizeof(bmp), &bmp);
hDC = ::CreateCompatibleDC(NULL);
SelectObject(hDC, jpgbmp);
::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(),
hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));
::DeleteObject(jpgbmp);
::DeleteDC(hDC);
}
CDC dcBitmap;
dcBitmap.CreateCompatibleDC(&dc); 这个需要释放 dcBitmap.Delete(); hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);
if(hResult){
HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult);
pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL);
dcBitmap.SelectObject(hOldBitmap);
::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(),
hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));SelectObject(hDC, oldBmp);
::DeleteObject(jpgbmp);
::DeleteDC(hDC);
CDC dcBitmap;
dcBitmap.CreateCompatibleDC(&dc);
hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);
// hResult 需要释放 DeleteObject(hResult) ;
if(hResult){
HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult);
pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL);
dcBitmap.SelectObject(hOldBitmap);