本人要实现在某一个小矩形区域内图形变换, 如果直接在该区域画上新图形,会造成原来的图形没有擦除,后面的图形有可能比它小,而盖上去,仍然能看到前面的图形。   
我现在的想法是,把该区域的背景获得,再画一遍,然后再在上面添加新的图形。 请问这如何实现:主要是如何实现获取该区域原来背景图? 求具体做法和相关函数! 本人曾经考虑采用invalidaterect()函数把原来的图形擦除,但是我这个图形变化是时间1秒钟触发一次,造成的结果是,新图一出来就闪一下没了,等到下一个时钟,又出来新图然后又闪一下没了, 对于这个方法,本人不得其解, 所以只好放弃,而采用上述方法。!  

解决方案 »

  1.   

    你可以采用增加一个内存DC进行绘图,首先取得原图形,放到CMemDC中,绘图的时候,用 BitBlt()函数将CMemDC中的图形放到当前的DC中,然后再绘图,即可。
      

  2.   

    我的代码写法,请看看! 
    void CTestbackgroundDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    srand( (unsigned)time( NULL ) );
    int shape = rand()%3;
    CClientDC  dlgDC(this);
    CRect rect(basex+5,basey+5, basex+size+1-5, basey+size+1-5);
    CPoint pts[4];
    switch (shape)
    {
    case 0:
    //画三角形 pts[0].x= basex;
    pts[0].y= basey;
    pts[1].x = basex+size;
    pts[1].y = basey;
    pts[2].x = basex;
    pts[2].y = basey + size;
    pts[3].x = basex;
    pts[3].y = basey;
    InvalidateRect(&rect, true);
    dlgDC.Polygon(pts, 4);
    break;
    case 1:
    pts[0].x= basex;
    pts[0].y= basey+size ;
    pts[1].x = basex+size;
    pts[1].y = basey+size;
    pts[2].x = basex+size;
    pts[2].y = basey;
    pts[3].x = basex;
    pts[3].y = basey+size;
    InvalidateRect(&rect, true);
    dlgDC.Polygon(pts, 4);
    break;
    case 2:
    pts[0].x = basex;
    pts[0].y = basey;
    pts[1].x = basex+size;
    pts[1].y = basey;
    pts[2].x = basex+size;
    pts[2].y = basey + size;
    pts[3].x = basex;
    pts[3].y = basey;
    InvalidateRect(&rect, true);
    dlgDC.Polygon(pts, 4);
    break;
    default:
    break;
    } CDialog::OnTimer(nIDEvent);

    我主要实现功能是设置一个时钟,然后根据时钟触发, 当生成随机数是0,1 ,2时分别在固定的方形区域内画三角形,并且在画之前先使用invalidaterect()该区域,很奇怪的是,新画的图只是一闪就过去了, 我一直不知道我这里出了什么问题,请各位执教!
      

  3.   

    呵呵,不用回答这个问题了,我现在在WM_ERASEBKGDN中编写画图代码,这样就需要用到invalidaterect函数,也不会出问题了 !