OnEraseBkgnd擦除背景的问题,急!

XGYHITSZ2012 2013-02-15 08:59:48
我在单文档窗口加载一幅图片,然后需要完成放大或缩小的功能,如果想要擦除窗口时窗口不闪,需要Invalidate参数加上FALSE,自己重新写出来OnEraseBkgnd
我的重写的OnEraseBkgnd,返回TRUE,可是缩小后背景就是无法擦除啊
哪位大牛知道,我是不是少了什么步骤?初学MFC,真的不大懂

BOOL CRectifiView::OnEraseBkgnd(CDC* pDC)
{

return TRUE; //CScrollView::OnEraseBkgnd(pDC);
}
void CRectifiView::OnZoomout()
{
// TODO: 在此添加命令处理程序代码
//m_bmZoom = ZOOMOUT;
m_scale *= 1.1;
Invalidate(FALSE);
}

void CRectifiView::OnZoomin()
{
// TODO: 在此添加命令处理程序代码
//m_bmZoom = ZOOMIN;
m_scale *= 0.9;
int width = int(m_pImg.Width()*m_scale);
int height = int(m_pImg.Height()*m_scale);

CRect rect;
GetClientRect(&rect);

int scroll_x = GetScrollPos(SB_HORZ);
int scroll_y = GetScrollPos(SB_VERT);

if((rect.right+scroll_x)>width)
{
scroll_x = (width - rect.right)>0?(width - rect.right):0;
}

if((rect.bottom+scroll_y)>height)
{
scroll_y = (height - rect.bottom)>0?(height - rect.bottom):0;
}

SetScrollPos(SB_HORZ, scroll_x);
SetScrollPos(SB_VERT, scroll_y);

Invalidate(FALSE);
}

...全文
531 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxn10050812 2013-03-25
  • 打赏
  • 举报
回复
我也在做类似的,不过用的是c#,有人知道c#里怎么调用OnEraseBkgnd吗,因为我要在鼠标移动时画游标,但是因为有背景图,游标就滞后。
XGYHITSZ2012 2013-02-15
  • 打赏
  • 举报
回复
7楼的说的很好谢谢了可是我加载的不是位图,是拿CvvImage画到HDC的
XGYHITSZ2012 2013-02-15
  • 打赏
  • 举报
回复
引用 6 楼 hdg3707 的回复:
因为你已知道改变大小了,所以也就知道哪块区域无效,你可以用InvalidateRect这个函数来改变无效区域
你教的我试了,可是……OnEraseBkgnd里加Invalidate(FALSE)没效果,再改成TRUE这个参数试不闪,没有效果不擦除背景。用InvalidateRect就算是取得整个窗口大小它也不擦除啊,除非让OnEraseBkgnd里面的CScrollView::OnEraseBkgnd(pDC)有效,但那样还是一闪一闪的。否则只设为TRUE这个OnEraseBkgnd就不工作。
dubiousway 2013-02-15
  • 打赏
  • 举报
回复
引用 4 楼 XGYHITSZ2012 的回复:
能说的详细些吗 我该怎样去写自己消除背景的语句?
说说过程: invalidate,决定是否删除背景。 当它参数是true的时候,才删除。(所以你不应该用false参数) 如何删除呢,就是调用系统的CWND的OnEraseBkgnd。 如果你重载了这个OnEraseBkgnd函数,那么就调用你自己的OnEraseBkgnd; 但这个时候,你就的负责清除背景。 (所谓清除背景,就是用一种画刷去填充背景,比如你用背景原来相同的颜色去填充一定的区域,那么这个区域的东西就被覆盖了,自然就是清除背景了) 填充的方法可以用 FillRect,fillrgn 之类的函数。 ------ 一般防止闪烁的方法,叫双缓冲,就是7楼的方法
moon5284 2013-02-15
  • 打赏
  • 举报
回复
先贴代码:
BOOL CXXXDlg::OnEraseBkgnd(CDC* pDC)
{
	CBitmap MemBitmap;//定义一个位图对象
	MemBitmap.LoadBitmap(IDB_BGC);//换成自己的bitmap
	BITMAP bmpInfo;    
	MemBitmap.GetBitmap(&bmpInfo);


	//SetWindowPos(NULL, 50, 50, bmpInfo.bmWidth, bmpInfo.bmHeight, SWP_NOZORDER);
	//CenterWindow();

	//随后建立与屏幕显示兼容的内存显示设备 
	CDC MemDC; //首先定义一个显示设备对象
	MemDC.CreateCompatibleDC(NULL);
	MemDC.SelectObject(&MemBitmap);

	//将内存中的图拷贝到屏幕上进行显示
	//        dc.SetViewportOrg(-m_nHScrollPos,-m_nVScrollPos);
	pDC->BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,&MemDC,0,0,SRCCOPY);
	//绘图完成后的清理
	MemBitmap.DeleteObject();
	MemDC.DeleteDC();

	return TRUE;
}
hdg3707 2013-02-15
  • 打赏
  • 举报
回复
因为你已知道改变大小了,所以也就知道哪块区域无效,你可以用InvalidateRect这个函数来改变无效区域
hdg3707 2013-02-15
  • 打赏
  • 举报
回复
加载一幅图片的代码及改变大小的代码,不是上面的设置比例的函数,你先在OnEraseBkgnd里加Invalidate(FALSE)试试,如果没效果,再改成TRUE这个参数试试(这时有可能是闪的,如果闪,就在这个函数里把加载图片及改变大的函数放在这里)
XGYHITSZ2012 2013-02-15
  • 打赏
  • 举报
回复
能说的详细些吗 我该怎样去写自己消除背景的语句?
XGYHITSZ2012 2013-02-15
  • 打赏
  • 举报
回复
引用 2 楼 dubiousway 的回复:
你返回true,就要自己处理删除背景操作阿。你怎么就只用 return TRUE;一条语句。 应该还有你自己的消除背景的语句吧
请问,怎样自己定义消除背景呢?除了Invalidate(FALSE),别的我没有查到啊
dubiousway 2013-02-15
  • 打赏
  • 举报
回复
你返回true,就要自己处理删除背景操作阿。你怎么就只用 return TRUE;一条语句。 应该还有你自己的消除背景的语句吧
XGYHITSZ2012 2013-02-15
  • 打赏
  • 举报
回复
怎么没人懂啊

15,979

社区成员

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

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