CImage图片放大显示,执行出错,m_HBitmap!=0 第二次操作时 m_HBitmap!=0 没释放。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在 重新 初始化 m_HBitmap 前。 inline CImage::CImage() throw() : m_hBitmap( NULL ), m_pBits( NULL ), m_hDC( NULL ), m_nDCRefCount( 0 ), m_hOldBitmap( NULL ), m_nWidth( 0 ), m_nHeight( 0 ), m_nPitch( 0 ), m_nBPP( 0 ), m_iTransparentColor( -1 ), m_bHasAlphaChannel( false ), m_bIsDIBSection( false ){ s_initGDIPlus.IncreaseCImageCount();}inline CImage::~CImage() throw(){ Destroy(); s_initGDIPlus.DecreaseCImageCount(); DeleteObject(m_hBitmap);}写这了,还是报错 CImage::~CImage() 可能没调用, 对象没释放,对象本身不需要释放, 是对象里的 m_hBitmap 要delete。找到第二次 使用这个对象的地方。 m_hBitmap我自己没有定义,是程序中用到m_Image.BitBlt和m_Image.StretchBlt。在用CImage自带的函数时,里面有 m_hBitmap 写在destroy之前或者写在析构函数中都可以。总之在m_hBitmap下次创建之前,老的m_hBitmap被删掉就可以了。 那就是:if(m_Image.m_hBitmap !=0 ) DeleteObject(m_Image.m_hBitmap); void CEx_ImageView::OnDraw(CDC* pDC){ CEx_ImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!m_Image.IsNull()) { //HDC hDC=m_Image.GetDC(); //CDC *pDC=CDC::FromHandle(hDC); CRect rect; GetClientRect(&rect); int rw = rect.right - rect.left; // 求出图片控件的宽和高 int rh = rect.bottom - rect.top; int iw =(int)canshu* m_Image.GetWidth(); // 读取图片的宽和高 int ih = (int)canshu*m_Image.GetWidth(); int tx = (int)(rw - iw)/2; // 使图片的显示位置正好在控件的正中 int ty = (int)(rh - ih)/2; //m_Image.Draw(pDC->m_hDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight()); if(tx>=0&&ty>=0) { //m_Image.Draw(pDC->m_hDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight()); int tx = (int)(rw - m_Image.GetWidth())/2; int ty = (int)(rh - m_Image.GetHeight())/2; ::SetStretchBltMode(pDC->m_hDC, HALFTONE); ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL); m_Image.StretchBlt(*pDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY); } else { if ((iw/rw)>(ih/rh)) { ty=(int)(rh-(rw*ih)/iw)/2; //m_Image.Draw(pDC->m_hDC,0,ty,rw,rh-2*ty,0,0,m_Image.GetWidth(),m_Image.GetHeight()); ::SetStretchBltMode(pDC->m_hDC, HALFTONE); ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL); m_Image.StretchBlt(*pDC,0,ty,rw,rh-2*ty,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY); } else { tx=(int)(rw-(rh*m_Image.GetWidth())/m_Image.GetHeight())/2; //m_Image.Draw(pDC->m_hDC,tx,0,rw-2*tx,rh,0,0,m_Image.GetWidth(),m_Image.GetHeight()); ::SetStretchBltMode(pDC->m_hDC, HALFTONE); ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL); m_Image.StretchBlt(*pDC,tx,0,rw-2*tx,rh,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY); } } } // TODO: 在此处为本机数据添加绘制代码 ReleaseDC(pDC);}void CEx_ImageView::OnMouseMove(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 if(mouse_m=1) { CString cord; int dd; CRect srect,drect,mrect; CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd ; CStatusBar *pStatus = &pFrame->m_wndStatusBar ; if (pStatus) { cord.Format(_T("X=%d, Y=%d"),point.x,point.y); pStatus->SetPaneText (1,cord); srect.left = point.x - s; srect.top = point.y - s; srect.right = point.x + s; srect.bottom = point.y + s; drect.left = point.x - d; drect.top = point.y - d; drect.right = point.x + d; drect.bottom = point.y + d; mrect.left = oldx - d; mrect.top = oldy - d; mrect.right = oldx + d; mrect.bottom = oldy + d; dd = 2*d; CDC * pDC = GetDC(); OnPrepareDC(pDC); if (recover) { //::DeleteObject(m_Image); m_Image.BitBlt(*pDC,mrect.left,mrect.top,dd,dd, mrect.left,mrect.top,mana); //m_Image.ReleaseDC(); //if(m_Image.m_hBitmap !=0 )::DeleteObject(m_Image.m_hBitmap); //if (m_hBitmap) ::DeleteObject(m_hBitmap); } //::DeleteObject(m_Image); ::SetStretchBltMode(pDC->m_hDC, HALFTONE); ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL); m_Image.StretchBlt(*pDC,drect.left,drect.top, drect.Width(),drect.Height(),srect.left, srect.top,srect.Width(),srect.Height(),mana); oldx = point.x; oldy = point.y; ReleaseDC(pDC); } recover = true; } CView::OnMouseMove(nFlags, point);}问题出在这两个地方,您再帮我看看 “if(mouse_m=1)” ==问题在哪句 ? 在和m_Image.BilBlt,m_Image.StretchBlt,相关的地方 void CEx_ImageView::OnDraw(CDC* pDC)这里是显示图片void CEx_ImageView::OnMouseMove(UINT nFlags, CPoint point)这里是响应鼠标位置,进行局部放大 98 99 100行都表示:m_hBitmap无法计算表达式的值 99 100: ::SetStretchBltMode(pDC->m_hDC, HALFTONE); ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);不对吧? 给语句, 不要 号! 就是那个“if(mouse_m=1)” 的问题,,,太尴尬了,谢谢你回答这么多问题! 要先将位图资源与对象进行分离,即在使用CImage 的Destroy()前,加CImage的Detach()。 VC界面SPIN控件控制文本框内容,按上或下按钮的第一下总会出错! 碰到一个设置问题,不知道怎么解决! 中文版VB6.0跟英文VB版本在调用Dll的差异(求教) 对 DIB CombineRgn 的问题,请教! 如何实现语法加亮?? 我想在VC中调用API来操作注册表,请问哪里有这方面的的资料和实例呢? CArray怎么定义多维数组并引用数组元素? 请问怎么去掉VC中的 CTRL+F5 之前的 自动保存功能??? 串口如何进行多线程接收数据? VC++如何调用matlab动态链接库 关于windows下, 信号量的问题, 父视窗弹出输入视窗
m_hBitmap( NULL ),
m_pBits( NULL ),
m_hDC( NULL ),
m_nDCRefCount( 0 ),
m_hOldBitmap( NULL ),
m_nWidth( 0 ),
m_nHeight( 0 ),
m_nPitch( 0 ),
m_nBPP( 0 ),
m_iTransparentColor( -1 ),
m_bHasAlphaChannel( false ),
m_bIsDIBSection( false )
{
s_initGDIPlus.IncreaseCImageCount();
}inline CImage::~CImage() throw()
{
Destroy();
s_initGDIPlus.DecreaseCImageCount();
DeleteObject(m_hBitmap);
}写这了,还是报错
可能没调用, 对象没释放,
对象本身不需要释放, 是对象里的 m_hBitmap 要delete。找到第二次 使用这个对象的地方。
if(m_Image.m_hBitmap !=0 ) DeleteObject(m_Image.m_hBitmap);
{
CEx_ImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!m_Image.IsNull())
{
//HDC hDC=m_Image.GetDC();
//CDC *pDC=CDC::FromHandle(hDC);
CRect rect;
GetClientRect(&rect);
int rw = rect.right - rect.left; // 求出图片控件的宽和高
int rh = rect.bottom - rect.top;
int iw =(int)canshu* m_Image.GetWidth(); // 读取图片的宽和高
int ih = (int)canshu*m_Image.GetWidth();
int tx = (int)(rw - iw)/2; // 使图片的显示位置正好在控件的正中
int ty = (int)(rh - ih)/2;
//m_Image.Draw(pDC->m_hDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight());
if(tx>=0&&ty>=0)
{
//m_Image.Draw(pDC->m_hDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight());
int tx = (int)(rw - m_Image.GetWidth())/2;
int ty = (int)(rh - m_Image.GetHeight())/2;
::SetStretchBltMode(pDC->m_hDC, HALFTONE);
::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
m_Image.StretchBlt(*pDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY);
}
else
{
if ((iw/rw)>(ih/rh))
{
ty=(int)(rh-(rw*ih)/iw)/2;
//m_Image.Draw(pDC->m_hDC,0,ty,rw,rh-2*ty,0,0,m_Image.GetWidth(),m_Image.GetHeight());
::SetStretchBltMode(pDC->m_hDC, HALFTONE);
::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
m_Image.StretchBlt(*pDC,0,ty,rw,rh-2*ty,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY);
}
else
{
tx=(int)(rw-(rh*m_Image.GetWidth())/m_Image.GetHeight())/2;
//m_Image.Draw(pDC->m_hDC,tx,0,rw-2*tx,rh,0,0,m_Image.GetWidth(),m_Image.GetHeight());
::SetStretchBltMode(pDC->m_hDC, HALFTONE);
::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
m_Image.StretchBlt(*pDC,tx,0,rw-2*tx,rh,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY);
}
}
} // TODO: 在此处为本机数据添加绘制代码
ReleaseDC(pDC);
}void CEx_ImageView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(mouse_m=1)
{
CString cord;
int dd;
CRect srect,drect,mrect;
CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd ;
CStatusBar *pStatus = &pFrame->m_wndStatusBar ;
if (pStatus)
{
cord.Format(_T("X=%d, Y=%d"),point.x,point.y);
pStatus->SetPaneText (1,cord);
srect.left = point.x - s;
srect.top = point.y - s;
srect.right = point.x + s;
srect.bottom = point.y + s; drect.left = point.x - d;
drect.top = point.y - d;
drect.right = point.x + d;
drect.bottom = point.y + d; mrect.left = oldx - d;
mrect.top = oldy - d;
mrect.right = oldx + d;
mrect.bottom = oldy + d;
dd = 2*d;
CDC * pDC = GetDC();
OnPrepareDC(pDC); if (recover)
{
//::DeleteObject(m_Image);
m_Image.BitBlt(*pDC,mrect.left,mrect.top,dd,dd, mrect.left,mrect.top,mana);
//m_Image.ReleaseDC();
//if(m_Image.m_hBitmap !=0 )::DeleteObject(m_Image.m_hBitmap);
//if (m_hBitmap) ::DeleteObject(m_hBitmap);
}
//::DeleteObject(m_Image);
::SetStretchBltMode(pDC->m_hDC, HALFTONE);
::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
m_Image.StretchBlt(*pDC,drect.left,drect.top, drect.Width(),drect.Height(),srect.left, srect.top,srect.Width(),srect.Height(),mana);
oldx = point.x;
oldy = point.y;
ReleaseDC(pDC);
}
recover = true;
}
CView::OnMouseMove(nFlags, point);
}问题出在这两个地方,您再帮我看看
void CEx_ImageView::OnMouseMove(UINT nFlags, CPoint point)这里是响应鼠标位置,进行局部放大
::SetStretchBltMode(pDC->m_hDC, HALFTONE);
::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
不对吧? 给语句, 不要 号!