//我用图形模式中的 SetROP2(R2_XORPEN)来设置虚框模式
//通调用DrawFocusRect()函数来画!
//问题是从左上角右下角可以画虚框的,但是由右到左,下到上就没有虚框了!这是什么原因呢?
//代码如下:
void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    m_ptOrigin=point;
    m_bDraw=TRUE;    m_pre.left=point.x;  
    m_pre.top=point.y;  
    m_pre.right=point.x;  
    m_pre.bottom=point.y;  
   
    m_new.left=point.x;  
    m_new.top=point.y;  
    m_new.right=point.x;  
    m_new.bottom=point.y;   
    CView::OnLButtonDown(nFlags, point);
}
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    m_bDraw=FALSE;
    CClientDC dc(this);
    CPen pen(PS_SOLID,3,RGB(255,0,0));
    dc.SelectObject(&pen);
    dc.SetROP2(R2_COPYPEN);  
    switch(m_nDrawType)
    {
    case 1:
        dc.SetPixel(point,RGB(255,0,0));
        break;
    case 2:
        dc.MoveTo(m_ptOrigin);
        dc.LineTo(point);
        break;
    case 3:
        dc.Rectangle(CRect(m_ptOrigin,point));
        break;
    case 4:
        dc.Ellipse(CRect(m_ptOrigin,point));
        break;
    }
    CView::OnLButtonUp(nFlags, point);
}
void CGraphicView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    if(m_bDraw)
    {
        CClientDC dc(this);
        dc.SetROP2(R2_XORPEN);    //设置虚框模式
        dc.DrawFocusRect(&m_pre);
        m_new.right=point.x;  
        m_new.bottom=point.y;  
        dc.DrawFocusRect(&m_new);//画新矩形 
        m_pre.right=m_new.right;  
        m_pre.bottom=m_new.bottom; 
        dc.SetROP2(R2_WHITE);
    }    
    CView::OnMouseMove(nFlags, point);
}

解决方案 »

  1.   

    应该是CRect这些类型本身的限制问题,如果你把right,bottom设定的值小于 left,top的值的时候就会出现你说的那个问题, 如果你想
    画出虚框 最好是直接使用MovoTo和LineTo划线!
      

  2.   

    void CGraphicView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    if(m_bDraw)
    {
    CClientDC dc(this);
    dc.SetROP2(R2_XORPEN);    //设置虚框模式
    dc.DrawFocusRect(&m_pre);
    if (m_ptOrigin.x < point.x)
    {
    m_new.left = m_ptOrigin.x;
    m_new.right = point.x;
    }
    else
    {
    m_new.left = point.x;
    m_new.right = m_ptOrigin.x;
    }
    if (m_ptOrigin.y < point.y)
    {
    m_new.top = m_ptOrigin.y;
    m_new.bottom = point.y;
    }
    else
    {
    m_new.top = point.y;
    m_new.bottom = m_ptOrigin.y;
    }
    dc.DrawFocusRect(&m_new);//画新矩形 
    m_pre = m_new;
    dc.SetROP2(R2_WHITE);
    }
    CView::OnMouseMove(nFlags, point);
    }
      

  3.   

    使用矩形绘制之前,调一下NormalizeRect,就好了
    实际上是绘制函数的问题,而不是举行本身
      

  4.   

    你原本的做法是把鼠标按下的点作为矩形的左上角,鼠标移动后的位置作为右下角,当鼠标不是向右下方移动时,矩形的参数就反了。我给的代码是把两个点的坐标对比,找出两个点中较小的x、y值作为left、top,较大的x、y值作为right、bottom。