我正在做一个可以从右往左移动的网格。
我用了两种方式:
1.单独做了一个CMemDC类,然后在onpaint中
CMemDC * MemDC = new CMemDC(pDC);//new 一个内存DC,然后往下做没问题,可以实现我要求的功能,网格移动。如图1
2.在主对话框类中新定义一个类实例CDC pmDC;这样做却不能实现,网格也移动,但是之前画的并没有被擦除。这是为什么啊。如图2
ps:我的重绘,用的定时器+invalidate。
代码如下
void CGraphicDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
....略
}
else
第一种
CPaintDC dc(this);
CDC *pDC=&dc;
CRect rect;
GetClientRect(&rect);
CMemDC * MemDC = new CMemDC(pDC);//new 一个内存DC
CPen brush;
brush.CreatePen(PS_SOLID,1,RGB(255,0,0));
if(!MemDC->m_hDC)
{
MemDC->CreateCompatibleDC(NULL);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
MemDC->SelectObject(&bitmap);
MemDC->FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));//绘制背景
MemDC->SelectObject(&brush);
}
for (int x=0; x<= 20; x++)
{
MemDC->MoveTo(x*gridx + gridxstartpos ,0);
MemDC->LineTo(x*gridx + gridxstartpos ,200);
}
gridxstartpos += -1;//网格移动速度gridxstartpos,-1
if(gridxstartpos < 0) gridxstartpos = gridx;//gridx = 10; //在x方向的网格距离
if(gridxstartpos > gridx) gridxstartpos = 0;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),MemDC,0,0,SRCCOPY);
第二种
CPaintDC dc(this);
CDC *pDC=&dc;
CRect rect;
GetClientRect(&rect);
CPen brush;
brush.CreatePen(PS_SOLID,1,RGB(255,0,0));
if(!pmDC.m_hDC)
{
pmDC.CreateCompatibleDC(NULL);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
pmDC.SelectObject(&bitmap);
pmDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));//绘制背景
pmDC.SelectObject(&brush);
}
for (int x=0; x<= 20; x++)
{
pmDC.MoveTo(x*gridx + gridxstartpos ,0);
pmDC.LineTo(x*gridx + gridxstartpos ,200);
}
gridxstartpos += -1;//网格移动速度gridxstartpos,-1
gridystartpos += gridyspeed;//网格移动速度gridxstartpos,0
if(gridxstartpos < 0) gridxstartpos = gridx;//gridx = 10; //在x方向的网格距离
if(gridxstartpos > gridx) gridxstartpos = 0;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&pmDC,0,0,SRCCOPY);
CDialog::OnPaint();
}
}