我用MFC编一个画图程序,为什么颜色那一块有问题?就是我开始画的时候和鼠标移动的时候颜色是对的,而当我再次点鼠标(画完图形后),颜色又变成黑的了?怎么回事?

解决方案 »

  1.   

    void CMyView::OnLButtonDown(UINT nFlags, CPoint point) //lbottondown处理信息
    {
    CClientDC dc(this);
    // TODO: Add your message handler code here and/or call default
    CreatePen(PS_SOLID,0,m_color);
    CBrush *CBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
    dc.SelectObject(CBrush);//....
    if(DrawType==1)
    {
    if(m_step==0)
    {
    m_startx=point.x;
    m_starty=point.y;
    m_step++;
    }
    else
    {
    dc.MoveTo(m_startx,m_starty);
    dc.LineTo(point.x,point.y);
              Cgraph *pgraph=new Cgraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
      m_ptrarray.Add(pgraph);                //添加图形到动态数组中
      CMyDoc*pDoc=GetDocument();
      ASSERT_VALID(pDoc);
      pDoc->AddGraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
      m_step=0;
      m_startx=m_starty=0;
      m_endx=m_endy=0;
    }
    }
    if(DrawType==2)
    {
    if(m_step==0)
    {
    m_startx=point.x;
    m_starty=point.y;
    m_step++;
    }
    else
    {
    dc.Rectangle(m_startx,m_starty,point.x,point.y);
    Cgraph *pgraph=new Cgraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
        m_ptrarray.Add(pgraph);
    CMyDoc*pDoc=GetDocument();
        ASSERT_VALID(pDoc);
            pDoc->AddGraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
    m_step=0;
    m_startx=m_starty=0;
    m_endx=m_endy=0;
    }
    }
    if(DrawType==3)
    {
    if(m_step==0)
    {
    m_startx=point.x;
    m_starty=point.y;
    m_step++;
    }
    else
    {
    dc.Ellipse(m_startx,m_starty,point.x,point.y);
    Cgraph *pgraph=new Cgraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
        m_ptrarray.Add(pgraph);
    CMyDoc*pDoc=GetDocument();
           ASSERT_VALID(pDoc);
              pDoc->AddGraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
    m_step=0;
    m_startx=m_starty=0;
    m_endx=m_endy=0;
    }
    }
    if(DrawType==4)
    { if(m_step==0)
    {
    m_startx=point.x;
    m_starty=point.y;
    m_step++;
    }
    else
    {
    dc.MoveTo(m_startx,m_starty);
    dc.LineTo(point.x,point.y);
    Cgraph *pgraph=new Cgraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
        m_ptrarray.Add(pgraph);
    CMyDoc*pDoc=GetDocument();
           ASSERT_VALID(pDoc);
              pDoc->AddGraph(DrawType,m_startx,m_starty,point.x,point.y,m_color);
    m_step=0;
    m_startx=m_starty=0;
    m_endx=m_endy=0;
    }
    }
    CView::OnLButtonDown(nFlags, point);
    }void CMyView::OnLButtonUp(UINT nFlags, CPoint point) //lbottonup处理信息
    {
    // TODO: Add your message handler code here and/or call default
    CMyDoc*pDoc=GetDocument();
    ASSERT_VALID(pDoc);
    CClientDC dc(this);
        CPen newPen;
    newPen.CreatePen(PS_SOLID,0,m_color);
    CBrush *CBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
    dc.SelectObject(CBrush);
    dc.SelectObject(&newPen);
    switch(DrawType)
    {
    case 1:
    break;
    case 2:

    break;
    case 3:

    break;
    case 4:

    break;
    case 5:
    if(m_dragging)
    {
           m_dragging=false;
            ReleaseCapture();
    }
    break;
    }

    CView::OnLButtonUp(nFlags, point);
    }
      

  2.   

     OnLButtonUp 里没画图要这段代码干嘛? 出了这个函数newPen 没了 当然还原为默认画笔啦
     CPen newPen; 
    newPen.CreatePen(PS_SOLID,0,m_color); 
    CBrush *CBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); 
    dc.SelectObject(CBrush); 
    dc.SelectObject(&newPen); 
      

  3.   

    OnLButtonDown 函数里反而没 SelectObject(&newPen) 不是在OnLButtonDown 里画吗?
    逻辑真乱
      

  4.   

    要记住一点,绘图代码必须放在OnPaint或者会被OnPaint调用到的函数里面,否则只要窗口一重绘或者被其他窗口覆盖后移开,那么所有努力都将白费。
    绘图放在OnLButtonDown里面本身就是一个设计错误。