听说可以把图先保存到内存.
是不是这样就可以一次性把内存里面的图重绘?(把内存的位图直接在Onpaint里调用,怎么调用?)

解决方案 »

  1.   

    把你的图元抽象成CLASS,将图元加入到绘制的链表中重绘,保存时就用序列化
      

  2.   

    我这里有份原代码,应该可以解决你的问题,这个问题确实比较恼火//此函数在文档类打开文件中完成
    CFileDialog  dlg(true,NULL);    //构建打开图像对话框
    dlg.DoModal();
     m_PicPath = dlg.GetPathName();  //得到图像的路径名
     
     image.load(dlg.GetPathName());   //将图像从硬盘中读入,解码,并存入到自己定义对象(image)中     
        UpdateAllViews(NULL);     //更新视图,此函数会调用WM_PAINT消息,并最终会调用
                              // CImageRetrievalView类中的OnDraw函数,显示图像
         然后在VIEW类中的OnDraw函数中完成显示部分UpdateData(FALSE); //把m_JiShu中的数传给EDIT控件,对图像计数// TODO: Add your specialized code here and/or call the base class//以下是对打开关键图进行显示CWnd* pWnd = GetDlgItem(IDC_KEY_IMAGE);//得到指向该ID的窗口类的指针
    CRect rectWnd;
    pWnd->GetWindowRect(&rectWnd);    //得到该窗口的大小
        //以下代码是为了防止宽高比不同的图像,显示在宽高比固定的Picture控件中,会出现变形
    double wk = 0,hk = 0,wc = 0,hc = 0;
    wk = GetDocument()->keyimage.getWidth();
    hk = GetDocument()->keyimage.getHeight();
    wc = rectWnd.Width();
    hc = rectWnd.Height();if (wk / hk > wc / hc)  //这种情况,说明控件中的高度过大,所以高度不用全部显示
    {
    double hcnew = (hk / wk)*wc;
    rectWnd.top = int (rectWnd.top + (hc-hcnew)/2);
    rectWnd.bottom = int (rectWnd.bottom - (hc-hcnew)/2);
    }
    else if (wk / hk < wc / hc)//这种情况,说明控件中的宽度过大,所以宽度不用全部显示
    {
    double wcnew = (wk / hk)*hc;
    rectWnd.left = int (rectWnd.left + (wc-wcnew)/2);
    rectWnd.right = int (rectWnd.right - (wc-wcnew)/2);
    }
        
    ScreenToClient(rectWnd);          //将屏幕的图像转换成窗口尺寸的大小来显示
    GetDocument()->keyimage.draw(pDC->GetSafeHdc(), rectWnd); 
    //显示该图像,因为image是在CImageRetrievalDoc类中定义的,所以
    //先要得到Document类的指针,GetDocument()就是用来得到该指针的
    //以下是对实时显示检索图进行显示CWnd* seekWnd = GetDlgItem(IDC_SEEK_IMAGE);//得到指向该ID的窗口类的指针
    CRect rectseekWnd;
    seekWnd->GetWindowRect(&rectseekWnd);    //得到该窗口的大小
    //以下代码是为了防止宽高比不同的图像,显示在宽高比固定的Picture控件中,会出现变形
    double wsk = 0,hsk = 0,wsc = 0,hsc = 0;
    wsk = Seekimage.getWidth();
    hsk = Seekimage.getHeight();
    wsc = rectseekWnd.Width();
    hsc = rectseekWnd.Height();if (wsk / hsk > wsc / hsc)  //这种情况,说明控件中的高度过大,所以高度不用全部显示
    {
    double hscnew = (hsk / wsk)*wsc;
    rectseekWnd.top = int (rectseekWnd.top + (hsc-hscnew)/2);
    rectseekWnd.bottom = int (rectseekWnd.bottom - (hsc-hscnew)/2);
    }
    else if (wsk / hsk < wsc / hsc)//这种情况,说明控件中的宽度过大,所以宽度不用全部显示
    {
    double wscnew = (wsk / hsk)*hsc;
    rectseekWnd.left = int (rectseekWnd.left + (wsc-wscnew)/2);
    rectseekWnd.right = int (rectseekWnd.right - (wsc-wscnew)/2);
    }ScreenToClient(rectseekWnd);          //将屏幕的图像转换成窗口尺寸的大小来显示//CClientDC TEMPDC(this);
    Seekimage.draw(pDC->GetSafeHdc(), rectseekWnd); 这种方式显示的效果比较好,界面美观,因为可以完全符合你自己定义的显示区域大小