CDialogBar为基类的对话框,用对话框绘制圆已经实现,但用鼠标直接在视图中绘制圆不知道怎样做?请教高人。
请大家详细点,我一定会给分的。

解决方案 »

  1.   

    首先明确鼠标绘图的操作,我设计如下:
    1. 按下左键确定圆心;
    2. 按住左键拖动出半径,同时画临时圆;
    3. 松开左键确定半径,画出最终的圆。实现方法:
    1. 按下左键确定圆心;
       在OnLeftBtnDown消息中,记录point.x与point.y作为圆心,保存在某个POINT变量中;2. 按住左键拖动出半径,同时画临时圆;
       在OnMouseMove消息中:
       根据上一次的鼠标point,与先前记录的圆心,用CDC::SetROP2(R2_NOT)方式绘制圆形(达到擦除目的);
       记录当前鼠标point坐标,以便下次清除临时圆;
       根据当前鼠标point,与先前记录的圆心,用CDC::SetROP2(R2_NOT)方式绘制新的圆形;3. 松开左键确定半径,画出最终的圆。
       在OnLeftBtnUp函数中:
       根据鼠标point和先前记录的半径,用黑色绘制永久圆形。注意:此时不用R2_NOT方式。
      

  2.   

    mousemove:
    //过两点画圆
    if(m_Circle1)
    {
    //擦去上次的画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_OldEnd.x ,m_OldEnd.y );
    //重新绘画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_End.x ,m_End.y ); 
    int r=(int)sqrt((m_OldEnd.x-m_Begin.x)*(m_OldEnd.x-m_Begin.x)+(m_OldEnd.y-m_Begin.y)*(m_OldEnd.y-m_Begin.y))/2;
    int r1=(int)sqrt((m_End.x-m_Begin.x)*(m_End.x-m_Begin.x)+(m_End.y-m_Begin.y)*(m_End.y-m_Begin.y))/2;
    CPoint cpoint,point1,point11,point2,point22;
    cpoint.x=(m_OldEnd.x+m_Begin.x)/2;
    cpoint.y=(m_OldEnd.y+m_Begin.y)/2;
    cpoint.Offset(-r,-r);
    point1=cpoint;
    cpoint.x=(m_OldEnd.x+m_Begin.x)/2;
    cpoint.y=(m_OldEnd.y+m_Begin.y)/2;
    cpoint.Offset(r,r);
    point11=cpoint;
    cpoint.x=(m_End.x+m_Begin.x)/2;
    cpoint.y=(m_End.y+m_Begin.y)/2;
    cpoint.Offset(-r1,-r1);
    point2=cpoint;
    cpoint.x=(m_End.x+m_Begin.x)/2;
    cpoint.y=(m_End.y+m_Begin.y)/2;
    cpoint.Offset(r1,r1);
    point22=cpoint;  
    pdc->Ellipse(CRect(point1,point11));//擦去上次的画
    pdc->Ellipse(CRect(point2,point22));//重新绘画
    }
    lbuttondown:
    if(m_Circle1)
    {

    m_OldDrawMode=pdc->SetROP2(R2_NOTXORPEN);
    //pen.CreatePen(PenStyle,PenWidth,m_PenColor); //PS_SOLID   
    // OldPen=pdc->SelectObject(&pen);
    //重新绘画
    //pdc->MoveTo(m_Begin.x ,m_Begin.y );
    // pdc->LineTo(m_OldEnd.x ,m_OldEnd.y );
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_End.x ,m_End.y ); 
    if(m_LineMeasure)
    {
    //m_pGridCtrl->SetItemText(0, 1,"直径");
    int InsertRow;
    double LineLen;
    CString strMessage; 
    strMessage.Format (_T ("%d"),m_pGridCtrl->GetRowCount());
    InsertRow=m_pGridCtrl->InsertRow(strMessage, -1);//-1为在最后增加一行
    LineLen=sqrt((m_End.x-m_Begin.x-1)*(m_End.x-m_Begin.x-1)*CurrentScaler.HCoefficient*CurrentScaler.HCoefficient+(m_End.y-m_Begin.y-1)*(m_End.y-m_Begin.y-1)*CurrentScaler.VCoefficient*CurrentScaler.VCoefficient);
    strMessage.Format (_T ("%.4f"),LineLen); 
    m_pGridCtrl->SetItemText(InsertRow, 1,strMessage);
    m_pGridCtrl->RedrawRow(InsertRow);
    }
    pdc->SetROP2(m_OldDrawMode);
    // pdc->SelectObject(OldPen);
    //pen.DeleteObject();
    CBrush Brush,*OldBrush;
    OldBrush=(CBrush*)pdc->SelectStockObject(NULL_BRUSH);
    int r1=(int)sqrt((m_End.x-m_Begin.x)*(m_End.x-m_Begin.x)+(m_End.y-m_Begin.y)*(m_End.y-m_Begin.y))/2;
    CPoint cpoint,point2,point22;

    cpoint.x=(m_Begin.x+m_End.x)/2;
    cpoint.y=(m_Begin.y+m_End.y)/2;
    //cpoint=m_Begin;
    cpoint.Offset(-r1,-r1);
    point2=cpoint;
    cpoint.x=(m_Begin.x+m_End.x)/2;
    cpoint.y=(m_Begin.y+m_End.y)/2;
    //cpoint=m_Begin;
    cpoint.Offset(r1,r1);
    point22=cpoint;
    //重新绘画
    pdc->Ellipse(CRect(point2,point22)); 
    //将直线画到图形上
    // if(!m_LineMeasure)
    // {
    // CBrush *OldMemBrush;
    // OldMemBrush=(CBrush*)pMemDC->SelectStockObject(NULL_BRUSH);
    // pMemDC->Ellipse(point2.x+ScrollPoint.x,point2.y+ScrollPoint.y,point22.x+ScrollPoint.x,point22.y+ScrollPoint.y);
    // pMemDC->SelectObject(OldMemBrush);
    //}
    pdc->SelectObject(OldBrush);
    }