MFC中bmp位图移动时后面有痕迹?怎么清除?

OK132 2011-04-16 06:19:47
void CSnowflakesView::OnTimer(UINT nIDEvent)
{

CRect rect;
GetClientRect(rect);
CDC *pDC = GetWindowDC();
if(nIDEvent==1)
{
snow1x=100;
snow1y+=2;
if(i==0)
{
Draw(0,n,pDC,snow1x,snow1y);
}
if(i==1)
{
Draw(1,n,pDC,snow1x,snow1y);
i=-1;
}
if(snow1y>=rect.bottom)
{snow1y=0;}
if(snow1x<=rect.left)
{snow1x=rect.right-20;}
if(snow1x>=rect.right)
{snow1x=0;}
i++;
//Invalidate();
}

CView::OnTimer(nIDEvent);

}

用Invalidate()的话就图片就刷新得基本看不到了。怎么样去除位图下落的痕迹?
...全文
189 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
joimson 2011-04-16
  • 打赏
  • 举报
回复
我也没有太仔细看你的代码,有点乱。
你在Ontimer里做控制就可以了,不要再它里面话东西,画东西你在OnPaint或OnDraw里面。在OnTimer里你只调用Invalidate刷新就可以了,如果你做的更好的话,就是用InvalidateRect()传入你要刷新的区域。两个效果都一样,只是多刷新少刷新的问题
OK132 2011-04-16
  • 打赏
  • 举报
回复
up!!!求助!!
无水先生 2011-04-16
  • 打赏
  • 举报
回复
采取局部画的方法.
OK132 2011-04-16
  • 打赏
  • 举报
回复
up!up!大家帮帮忙呀!我是新手,刚刚学MFC。
OK132 2011-04-16
  • 打赏
  • 举报
回复
补充下我的代码:
#include "stdafx.h"
#include "snowflakes.h"

#include "snowflakesDoc.h"
#include "snowflakesView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSnowflakesView

IMPLEMENT_DYNCREATE(CSnowflakesView, CView)

BEGIN_MESSAGE_MAP(CSnowflakesView, CView)
//{{AFX_MSG_MAP(CSnowflakesView)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSnowflakesView construction/destruction

CSnowflakesView::CSnowflakesView()
{
// TODO: add construction code here

m_Bitmap[0].LoadBitmap(IDB_BITMAP1);
m_Bitmap[1].LoadBitmap(IDB_BITMAP2);

m_Bitmap[16].LoadBitmap(IDB_BITMAP17);//背景图片

i=0;
j=0;
n=2;
m_brushBackground.CreatePatternBrush(&m_Bitmap[16]);


}

CSnowflakesView::~CSnowflakesView()
{

}

BOOL CSnowflakesView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSnowflakesView drawing

void CSnowflakesView::OnDraw(CDC* pDC)
{
CRect rect;
GetClientRect(rect);///取得客户区域
pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域

CSnowflakesDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}

/////////////////////////////////////////////////////////////////////////////
// CSnowflakesView diagnostics

void CSnowflakesView::Draw(int i,int n,CDC* pDC,int x,int y)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=MemDC.SelectObject(&m_Bitmap[i]);
BITMAP bm;
m_Bitmap[i].GetObject(sizeof(BITMAP),&bm);
TransparentBlt(pDC->m_hDC,x,y,bm.bmWidth/n,bm.bmHeight/n, MemDC.m_hDC, 0, 0, bm.bmWidth,bm.bmHeight, RGB(23,28,82));
MemDC.SelectObject(pOldBitmap);
}

#ifdef _DEBUG
void CSnowflakesView::AssertValid() const
{
CView::AssertValid();
}

void CSnowflakesView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CSnowflakesDoc* CSnowflakesView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSnowflakesDoc)));
return (CSnowflakesDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSnowflakesView message handlers

int CSnowflakesView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here

return 0;
}

void CSnowflakesView::OnTimer(UINT nIDEvent)
{
CRect rect;
GetClientRect(rect);
// TODO: Add your message handler code here and/or call default
CDC *pDC = GetWindowDC();
if(nIDEvent==1)
{
snow1x=100;
snow1y+=2;

if(i==0)
{
Draw(0,n,pDC,snow1x,snow1y);
}
if(i==1)
{
Draw(1,n,pDC,snow1x,snow1y);
i=-1;
}
if(snow1y>=rect.bottom)
{snow1y=0;}
if(snow1x<=rect.left)
{snow1x=rect.right-20;}
if(snow1x>=rect.right)
{snow1x=0;}
i++;
//Invalidate();
//InvalidateRect(FALSE);
}

CView::OnTimer(nIDEvent);

}

void CSnowflakesView::OnInitialUpdate()
{
CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class
CRect rect;
GetClientRect(rect);

snow1x = rect.left+100;
snow1y = 0;

SetTimer(1, 200, NULL);

}

void CSnowflakesView::Init()
{
}

BOOL CSnowflakesView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default

return true;


// return CView::OnEraseBkgnd(pDC);
}
HowToP2p 2011-04-16
  • 打赏
  • 举报
回复
void CsrrView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC dc(this);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap *pOldbmp=MemDC.SelectObject(&bmp);

dc.BitBlt(rtBmp.left,rtBmp.top,rtBmp.Width(),rtBmp.Height(),&MemDC,0,0,SRCCOPY);


InvalidateRect(rtBmp);
rtBmp.top+=2;

CView::OnTimer(nIDEvent);
}


void CsrrView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CView::OnPaint()

CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap *pOldbmp=MemDC.SelectObject(&bmp);

dc.BitBlt(rtBmp.left,rtBmp.top,rtBmp.Width(),rtBmp.Height(),&MemDC,0,0,SRCCOPY);


MemDC.SelectObject(&pOldbmp);
}




void CsrrView::OnInitialUpdate()
{
CView::OnInitialUpdate();

bmp.LoadBitmapW(IDB_BITMAP1);
BITMAP bmpInfo;

bmp.GetBitmap(&bmpInfo);

this->rtBmp.left=200;
this->rtBmp.top=0;

rtBmp.right=200+bmpInfo.bmWidth;
rtBmp.bottom=200+bmpInfo.bmHeight;

SetTimer(1,1000,NULL);

// TODO: 在此添加专用代码和/或调用基类
}


你的具体代码我不知道,不过大致就是这样的,你参考一下吧 bmp是CBitmap成员变量,rtBmp是位图的rect,先初始化它
OK132 2011-04-16
  • 打赏
  • 举报
回复
LS的不行呀,窗口直接透明了,然后还是会有下落的痕迹不能清除。
HowToP2p 2011-04-16
  • 打赏
  • 举报
回复
试试
OnTimer里面画,OnPaint里面也要画,然后用InvalidateRect

19,468

社区成员

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

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