背景图是动态导入的,在一个文件夹中有很多可选的,当我不导背景的时候,拖动图元很正常,可是导入背景图后拖动图元旧的不擦除。我为了让画上去的图在背景滚动的时候不闪烁,就把背景和画上去的图放在同一个内存DC里的,却导致拖动图元不能擦除。贴上部分代码:当我动态选择背景图之后HBITMAP m_hBmpTemp保存了选择的背景图,然后ExistBK=TRUE;
在OnPaint中:
CPaintDC dc(this);
Redraw();
CDialog::OnPaint();在自定义的Redraw()中:
CDC *pDC=GetDC();
CDC MemDC;
CRect rcclient;
GetClientRect(&rcclient);
MemDC.CreateCompatibleDC( pDC);
if (ExistBK==TRUE)//当有背景图的时候
{
if (bk_flag==1)
{
VERIFY(m_hBmpOld = (HBITMAP)SelectObject(MemDC,m_hBmpTemp) );
bk_flag=0;
}
else
{
SelectObject(MemDC,m_hBmpTemp);
}
for (int i=0;i<ptrArray.GetSize();i++)
{
((PicElement *)ptrArray.GetAt(i))->DrawElement(&MemDC);//ptrArray保存了我画上去的所有图
}//offsetx,offsety,m_size.cx,m_size.cy, sourcex, sourcey都是跟滚动相关的
pDC->BitBlt(offsetx,offsety,m_size.cx,m_size.cy, &MemDC, sourcex, sourcey,SRCCOPY);
erase=false;
MemDC.DeleteDC();
} else //没有背景图时,背景色是白色
{
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,rcclient.right,rcclient.bottom);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,pDC,0,0,SRCCOPY);
for (int i=0;i<ptrArray.GetSize();i++)
{
((PicElement *)ptrArray.GetAt(i))->DrawElement(&MemDC);
}
pDC->BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
} ReleaseDC(pDC);在OnEraseBkgnd()中:
if (erase)
{
return TRUE;
}
else
{
CRect rcClient;
GetClientRect(&rcClient);
rcClient.bottom-=(TOOLBAR_HEIGHT);
pDC->FillRect(&rcClient,&m_brBk);//m_brBk是个白色的画刷,为了最开始能显示白色背景
return TRUE;
}
在OnPaint中:
CPaintDC dc(this);
Redraw();
CDialog::OnPaint();在自定义的Redraw()中:
CDC *pDC=GetDC();
CDC MemDC;
CRect rcclient;
GetClientRect(&rcclient);
MemDC.CreateCompatibleDC( pDC);
if (ExistBK==TRUE)//当有背景图的时候
{
if (bk_flag==1)
{
VERIFY(m_hBmpOld = (HBITMAP)SelectObject(MemDC,m_hBmpTemp) );
bk_flag=0;
}
else
{
SelectObject(MemDC,m_hBmpTemp);
}
for (int i=0;i<ptrArray.GetSize();i++)
{
((PicElement *)ptrArray.GetAt(i))->DrawElement(&MemDC);//ptrArray保存了我画上去的所有图
}//offsetx,offsety,m_size.cx,m_size.cy, sourcex, sourcey都是跟滚动相关的
pDC->BitBlt(offsetx,offsety,m_size.cx,m_size.cy, &MemDC, sourcex, sourcey,SRCCOPY);
erase=false;
MemDC.DeleteDC();
} else //没有背景图时,背景色是白色
{
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,rcclient.right,rcclient.bottom);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,pDC,0,0,SRCCOPY);
for (int i=0;i<ptrArray.GetSize();i++)
{
((PicElement *)ptrArray.GetAt(i))->DrawElement(&MemDC);
}
pDC->BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
} ReleaseDC(pDC);在OnEraseBkgnd()中:
if (erase)
{
return TRUE;
}
else
{
CRect rcClient;
GetClientRect(&rcClient);
rcClient.bottom-=(TOOLBAR_HEIGHT);
pDC->FillRect(&rcClient,&m_brBk);//m_brBk是个白色的画刷,为了最开始能显示白色背景
return TRUE;
}
解决方案 »
- vs2010 ribbon里怎么使项管理器中的项进行消息响应啊?
- WINPCAP中库文件发生错误
- DrawDibDraw 画出来的图像是上下倒置的吗?
- 什么是thread safe(线程安全)别笑
- 请问程序中的extern "C" 都起到了什么作用?他是在编译时起作用还是运行时起作用?
- 怎样才能使得到的位图变小?
- VC++写的DLL在DELPHI中的调用
- ???我实在是搞不懂啊!为什么我的WSAIoctl()函数用不起来!
- 学完了孙鑫C++,还有什么好的教程继续学习?
- 用vc进行视频捕捉的问题,请大家一定帮忙,求您了
- MFC简单绘图程序,怎样实现拖动功能。新手,尽量详细点。
- 为什么这两个函数参数是一样的:SetSecurityDescriptorDacl()和SetSecurityDescriptorSacl()
http://blog.csdn.net/xianglitian/archive/2010/11/20/6023656.aspx
{
VERIFY(m_hBmpOld = (HBITMAP)SelectObject(MemDC,m_hBmpTemp) );
bk_flag=0;
}
else
{
SelectObject(MemDC,m_hBmpTemp);
}
这里就画了背景了
这个只是选进来,不算画,画是类似BitBlt或StretchDiBits那种
{
VERIFY(m_hBmpOld = (HBITMAP)SelectObject(MemDC,m_hBmpTemp) );
bk_flag=0;
}
这句改为:
if (bk_flag==1)
{
VERIFY(m_hBmpOld = (HBITMAP)SelectObject(pDC->GetSafeHdc(),m_hBmpTemp) );
MemDC.BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,pDC,0,0,SRCCOPY);
bk_flag=0;
}这样试过没
试过了,还是不行,跟我的MOUSEMOVE的代码有关吗?为什么不导背景的时候是正常的
MemDC.BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,pDC,0,0,SRCCOPY);
相当于刷新而你在画有背景时,没有这种刷新,所以就会导致重叠