CDC绘图问题,请教高手

DwyaneCV 2013-12-09 10:49:43
我正在做一个可以从右往左移动的网格。
我用了两种方式:
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();
}
}
...全文
139 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
_船长_ 2013-12-09
  • 打赏
  • 举报
回复
引用 3 楼 dwyaneyywade 的回复:
[quote=引用 2 楼 jzycode 的回复:] pmDC成员变量?那就是背景没有擦除,绘制之前先用背景色填充一下pmDC
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.SelectObject(&brush);
}


/*将之前的画面用背景色擦除一下*/
pmDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));//绘制背景



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();
为什么对于指针,就要没问题???[/quote] 对于指针没有问题,那是因为你每次用的时候再创建,就没有什么之前画面这一说,每次都是在新的DC上绘图
DwyaneCV 2013-12-09
  • 打赏
  • 举报
回复
引用 2 楼 jzycode 的回复:
pmDC成员变量?那就是背景没有擦除,绘制之前先用背景色填充一下pmDC
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.SelectObject(&brush);
}


/*将之前的画面用背景色擦除一下*/
pmDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));//绘制背景



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();
为什么对于指针,就要没问题???
_船长_ 2013-12-09
  • 打赏
  • 举报
回复
pmDC成员变量?那就是背景没有擦除,绘制之前先用背景色填充一下pmDC
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.SelectObject(&brush);
}


/*将之前的画面用背景色擦除一下*/
pmDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));//绘制背景



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();
DwyaneCV 2013-12-09
  • 打赏
  • 举报
回复
是不是问题出在定义一个类的指针和定义一个类的对象,效果是不同的????

19,469

社区成员

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

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