写了个小小的画图程序,但画了以后切换到别的窗口再切换回来或窗口被遮盖的话刚刚画的图都没了?要如何重绘刚刚的图片或如何保证不被画的图不消失?另外又如何清屏呢,就是画了很多图以后要清除掉.

解决方案 »

  1.   

    在响应WM_PAINT消息的地方绘制。
      

  2.   

    你的代码应该是写在OnPaint或者是OnDraw中。
    因为窗口切换会使窗口重绘
    所以触发你之前画出来的那些代码是没有被执行了
      

  3.   

    把你的绘图代码写在Ondraw或者onpaint函数中就行了
    http://www.vckbase.com/
    那里有很多绘图方面的例子
      

  4.   

    可是我是根据鼠标事件来响应画图的啊,难道在LButtonDown里调用Ondraw或onpaint函数来画图?
      

  5.   

    在 OnPaint()里面重新绘制就可以了 !
      

  6.   

    那就是说我在OnLButtonDown里的代码得在OnPaint或OnDraw里重新写一遍?
    谢谢楼上几位回答问题谢。
      

  7.   

    那就是说我在OnLButtonDown里的代码得在OnPaint或OnDraw里重新写一遍?
    ----------------你在OnLButtonDown 是不是点了两下? 然后有了一线??
    OnLButtonDown 里点的时候把坐标记下来,再点的时候再记下来,(所以要有两个CPoint变量)
      点完后调用InvalidateRect()  
     
      在OnDraw 里在连接这两个点~ ,这样就可以保存了
      

  8.   

    那就是说我在OnLButtonDown里的代码得在OnPaint或OnDraw里重新写一遍?
    ----------------你在OnLButtonDown 是不是点了两下? 然后有了一线??
    OnLButtonDown 里点的时候把坐标记下来,再点的时候再记下来,(所以要有两个CPoint变量)
      点完后调用InvalidateRect()  
     
      在OnDraw 里在连接这两个点~ ,这样就可以保存了
      

  9.   

    to surstar(断水流):不管是点几下我想都把窗口里的东西保存下来,目前我的是点两下,调用InvalidateRect()是为什么呢?
    在OnDraw 里在连接这两个点是什么意思?请指教.
      

  10.   

    把绘图代码直接写在OnDraw或OnPaint事件里...
    闪闪闪!~~呵呵
      

  11.   

    int CCreateLine::OnLButtonDown(UINT nFlags, const Position& pos)
    {
      m_nStep++;//每次单击鼠标左键时操作步加1
      switch(m_nStep)//根据操作步执行相应的操作
      {
          case 1:
    {
    m_begin = m_end = pos;
    ::Prompt("请输入直线的末端点:");
    break;
    }
          case 2:
    {
    CDC* pDC = g_pView->GetDC(); CLine* pTempLine = new CLine(m_begin, m_end);
    pTempLine->Draw(pDC, dmDrag);
    delete pTempLine; if(nFlags & MK_SHIFT){
        double dx = pos.x - m_begin.x;
    double dy = pos.y - m_begin.y;
    if(fabs(dx) <= fabs(dy))
    m_end.Set(m_begin.x, pos.y);
    else
        m_end.Set(pos.x, m_begin.y);
    }
    else
    m_end = pos;
    CLine* pNewLine = new CLine(m_begin, m_end);
    pNewLine->Draw(pDC, dmNormal);
    g_pDoc->m_EntityList.AddTail(pNewLine);
    // 设置文档修改标记
    g_pDoc->SetModifiedFlag(TRUE); g_pView->ReleaseDC(pDC); m_nStep = 0;
    ::Prompt("请输入直线的起点"); break;
    }
      }
      return 0;
    }int CCreateLine::OnMouseMove(UINT nFlags, const Position& pos)
    {
      // 用一静态变量nPreRefresh记录进入OnMouseMove状态时的刷新次数
    static int nPreRefresh = g_nRefresh; 
    // 布尔变量bRefresh说明在OnMouseMove过程中视窗是否被刷新
    BOOL bRefresh = FALSE; 
    // nCurRefresh用于记录当前的刷新次数
    int nCurRefresh = g_nRefresh; 
    // 如果nCurRefresh和nPreRefresh不相等,说明视窗曾被刷新过
    if(nCurRefresh != nPreRefresh){ 
    bRefresh = TRUE;
    nPreRefresh = nCurRefresh; 
    }
      switch(m_nStep)
      {
            case 0:
    {
    ::Prompt("请输入直线的起点:");
    break;
    }
          case 1:
    {
    Position prePos, curPos;
    prePos = m_end;

    if(nFlags & MK_SHIFT){
        double dx = pos.x - m_begin.x;
    double dy = pos.y - m_begin.y;
    if(fabs(dx) >= fabs(dy))
    curPos.Set(pos.x, m_begin.y);
    else
        curPos.Set(m_begin.x, pos.y);
    }
    else
    curPos = pos;
                CDC* pDC = g_pView->GetDC();
    CLine* pTempLine1 = new CLine(m_begin, prePos);
             if(!bRefresh) 
    // 当视窗没有被刷新时,重画原来的橡皮线使其被擦除

    pTempLine1->Draw(pDC, dmDrag);
    delete pTempLine1; CLine* pTempLine2 = new CLine(m_begin, curPos);
    pTempLine2->Draw(pDC, dmDrag);
    delete pTempLine2;

    g_pView->ReleaseDC(pDC); m_end = curPos;

    break;
    }
      }
      return 0;
    }int CCreateLine::OnRButtonDown(UINT nFlags, const Position& pos)
    {
    if(m_nStep ==1){
           CDC* pDC = g_pView->GetDC();
       Position prePos = m_end;
       CLine* pTempLine = new CLine(m_begin, prePos);
       pTempLine->Draw(pDC, dmDrag);
       delete pTempLine;
       g_pView->ReleaseDC(pDC); }
    m_nStep = 0;
    ::Prompt("请输入直线的起点");
    return 0;
    }
    /////////////////////////////////
    void CLine::Draw(CDC * pDC, int drawMode /* = dmNormal */)
    {
    CPoint pt_begin, pt_end; // 屏幕坐标的起点和终点
    // 将世界坐标转化为屏幕坐标
    g_pView->WorldtoScreen(m_begin,pt_begin); 
    g_pView->WorldtoScreen(m_end,pt_end) ;
    // 得到原来的绘图模式
    int n = GetROP2(pDC->GetSafeHdc()); 
    // 创建画笔的原则:
    // 如果在正常的绘图模式下,使用成员变量创建画笔
    // 如果是其它的模式,使用全局函数"SetDrawEnvir"创建画笔
    CPen pen; 
    if( drawMode == dmNormal )  
    pen.CreatePen(m_lineStyle,m_lineWidth,m_color) ;
    else 
    ::SetDrawEnvir(pDC, drawMode, &pen);
    // 得到原来的画笔
    CPen* pOldPen = pDC->SelectObject(&pen); 
    pDC->SetMapMode(MM_LOENGLISH); 
    // 根据屏幕坐标绘制图元
    pDC->MoveTo(pt_begin); 
    pDC->LineTo(pt_end);
    // 恢复原来的画笔 
    pDC->SelectObject(pOldPen); 
    // 恢复原来的绘图模式
    pDC->SetROP2(n); 
    }