MFC 位图缩小时,原来的位图擦不掉.

zhongdugen 2014-05-06 09:07:35
各位好,我在做一个位图的放大缩小时,当滚动条拉到右下角,放小图片的时候,原来的图片没擦掉,
pDoc->UpdateAllViews(NULL);
Invalidate ( TRUE );
InvalidateRect(&client);这三个函数都试 过了,还是没有效果,但我最小化窗口,然后再还原窗口就正常了,请高手帮忙看下什么原因,怎么解决?

最小化,窗口,再还原窗口,或是点下滚动条就正常了,如图


ondraw代码
void CCDPatternView::OnDraw(CDC* pDC)
{
CCDPatternDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码;
//自适应窗口,大于窗口调用滚动条;
CSize sizeTotal;
sizeTotal.cx =m_change.Width();
sizeTotal.cy =m_change.Height() ;
SetScrollSizes(MM_TEXT, sizeTotal);
m_ImageSize=sizeTotal;

//m_ImgHScrollPos;
//m_ImgVScrollPos;
//解决图像闪烁问题;
CRect client;
CRect rect_2;
CClientDC dc_1(this);
OnPrepareDC(&dc_1);
GetClientRect(&rect_2);
dc_1.DPtoLP(&rect_2);

GetClientRect(&client);
//dc_1.DPtoLP(&client);

long offsetx=client.Width()/2-(m_change.right-m_change.left)/2;//中心
long offsety=client.Height()/2-(m_change.bottom-m_change.top)/2;

CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
long x,y;

x=client.Width();
y=client.Height();

int a=((int)client.right/m_rate+1)*m_rate;
int b=((int)client.bottom/m_rate+1)*m_rate;


MemBitmap.CreateCompatibleBitmap(pDC,a,b);



CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,a,b,RGB(155,205,255));




//CRect partDIB;
//partDIB=m_rcDIB;

int PartrcDIBx=(int)client.right/m_rate+1;
int PartrcDIBy=(int)client.bottom/m_rate+1;
CPoint pt;


CSize sz(PartrcDIBx,PartrcDIBy);
CRect partDIB(pt,sz);//用于指定原图里要放大的区域;


int PartsrcDIBx=PartrcDIBx*(m_rate);
int PartsrcDIBy=PartrcDIBy*(m_rate);
CRect clientPro(0,0,PartsrcDIBx,PartsrcDIBy);//用于变成客户区大小(为了精确);
PaintDIB(MemDC.GetSafeHdc(),
0,
0,
clientPro,
// 0,0,client
pDoc->m_hDIB,
partDIB,
NULL,
SRCCOPY);


if(m_rate>=4) //大于4倍画网格
{
if (offsetx<0)
{
DrawGrid(&MemDC,client.right,m_change.bottom);
}
else if (offsety<0)
{
DrawGrid(&MemDC,m_change.right,client.bottom);
}
else if(offsetx>0&&offsety>0)
{
DrawGrid(&MemDC,m_change.right,m_change.bottom);
}
else
{
DrawGrid(&MemDC,client.right,client.bottom);
}
}


if (offsety>=0)
{
m_ImgVScrollPos=0;
m_ImgHScrollPos=rect_2.left;
}
else if(offsetx>=0)
{
m_ImgHScrollPos=0;
m_ImgVScrollPos=rect_2.top;//这个值;
}
else if (offsety>0&&offsety>0)
{
m_ImgHScrollPos=0;
m_ImgVScrollPos=0;
}

pDC->BitBlt(m_ImgHScrollPos,m_ImgVScrollPos,x,y,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();




UpdateRulersInfo(RW_VSCROLL, GetScrollPosition());
UpdateRulersInfo(RW_HSCROLL, GetScrollPosition());
}
...全文
157 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lis2012 2014-05-11
  • 打赏
  • 举报
回复
使用双缓存来绘制,三次绘制效率太低
wu4357815 2014-05-11
  • 打赏
  • 举报
回复
画图之前memDC2.FillSolidRect用这个函数,即可用背景色填充,再绘制即可
rxguoblp 2014-05-09
  • 打赏
  • 举报
回复
引用 3 楼 zhongdugen 的回复:
rxguoblp试过你的方法了,还是不行,目前我想的解决方法是让它刷三次就正常了.这种办法显然比较笨.
为什么是3次?代码放到什么地方?
zhongdugen 2014-05-08
  • 打赏
  • 举报
回复
rxguoblp试过你的方法了,还是不行,目前我想的解决方法是让它刷三次就正常了.这种办法显然比较笨.
rxguoblp 2014-05-08
  • 打赏
  • 举报
回复
创建一个背景刷子,在贴图之前先刷一下整个背景: pDC->FillRect(客户区,&brush); pDC->BitBlt(m_ImgHScrollPos,m_ImgVScrollPos,x,y,&MemDC,0,0,SRCCOPY); MemBitmap.DeleteObject(); MemDC.DeleteDC();

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧