我想在view中画一条线,而这条线是一个类的对象(当然这个类还有其它的属性),我希望在鼠标移动到线上时,鼠标的事件由线所在的类直接处理,而不是在由view处理,而且,这条线要能够支持拖动,哪位能给个好的建议,谢谢!

解决方案 »

  1.   

    class CLine : public Cobject
    {
    public:

    public:   
    double m_1X,m_1Y,m_2X,m_2Y; //直线的起点和终点
    // DECLARE_SERIAL(CLine); //声明串形化
    BOOL bDisplay;  //是否可视
    BOOL bLocated;  //是否可选
    int  iMinScale;  //最小显示比例尺
    int  iMaxScale;  //最小显示比例尺
        int  m_id_only1,  m_id_only2;
    public:
    int x1,x2,y1,y2;
    public:
    CLine(); //不带任何参数的构造函数
    //以下是有初始化参数的构造函数
    CLine(short ColorPen,short ColorBrush,
    short LineWide,short LineType,short Layer,int id_only1,
    int id_only2,double X1,double Y1,double X2,double Y2);
    //直线的绘制函数
    virtual void Draw(CDC *pDC,int m_brushMode,int m_penMode,short BackColor);
    //得到边界矩形的函数
     virtual void GetRect(double  *minX,double  *minY,double *maxX,double *maxY);
    //判断是否被点选中的函数
    virtual BOOL  IsPoint(double x,double y,double jl,double blc);
        virtual ~CLine();
    };
      

  2.   

    if(b_Delete) //如果已经处于删除状态则返回
    return;  //<<<<<<<<<<<<<<<<<<<<<<<<<<
    double minx,miny,maxx,maxy;
    GetRect(&minx,&miny,&maxx,&maxy);
    if(!IsRectCross(minx,miny,maxx,maxy))//若不与屏幕相交则返回
    return;                          //<<<<<<<<<<<<<<<<<<<<
    */ //-------------------------------------------------------------
    // int x1,y1,x2,y2;           //·两个点的坐标
    short LineType=m_LineType; //·轮廓线
    short ColorPen=m_ColorPen; //·轮廓色
    //pDC->SetTextColor(RGB(255,0,0));
    if(m_penMode==1)//如被鼠标选择后特殊显示******************
    {
    if(m_LineType!=2)
    LineType=2;
    else
    LineType++; }// ::MessageBox(NULL,NULL,"b",NULL);

    //没有选中时正常的显示
    DWORD m_color;
    if(ColorPen==1)
    {
    m_color=RGB(0,0,255);
    }
    else if(ColorPen==2)
    {
    m_color=RGB(255,0,0);
    }
    // pDC->TextOut(100,100,"SEL");
    // }
    //设定画笔的<线型.宽度.颜色>-----------------
    CPen pen((int)LineType,(int)m_LineWide,m_color);
    CPen* pOldPen=pDC->SelectObject(&pen);//保存旧画笔
    /*
    if(m_brushMode==0)            //若是
    pDC->SetROP2(R2_COPYPEN);//设定正常覆盖的绘制模式
    else if(m_brushMode==1)       //若是
    pDC->SetROP2(R2_NOT);    //设定反色的绘制模式//     DPtoVp(11,33,&x1,&y1);//转换两点坐标
         DPtoVp(22,77,&x2,&y2);
    */ if(m_penMode==1)//如被鼠标选择后特殊显示点******************
    {
    // pDC->SetROP2(NULL);
        pDC->Rectangle(x1-5,y1-5,x1+5,y1+5);
        pDC->Rectangle(x2-5,y2-5,x2+5,y2+5);
    }

    pDC->MoveTo(x1,y1);       //以屏幕坐标画图
    pDC->LineTo(x2,y2);    pDC->SelectObject(pOldPen);//恢复旧画笔
        
    pOldPen->DeleteObject();
    pen.DeleteObject();
    }//函数Line::GetRect作用:计算并返回一条直线的矩形边界
    void CLine::GetRect(double *minX,double *minY,double *maxX,double *maxY)
    {
    *minX=min(m_1X,m_2X);  //计算并返回最小x值
    *maxX=max(m_1X,m_2X);  //计算并返回最大x值
    *minY=min(m_1Y,m_2Y);  //计算并返回最小y值
    *maxY=max(m_1Y,m_2Y);  //计算并返回最大y值
    }//函数:CLine::IsPoint
    //作用:判断点是否在直线上,参数(x,y)是点中点的坐标,jl为点中的距离范围
    //返回:1-点中直线 0-没有点中
    BOOL CLine::IsPoint(double x,double y,double jl,double blc)
    {
       // if(b_Delete)
    // return FALSE;    double xx,x1,x2,y1,y2;
    GetRect(&x1,&y1,&x2,&y2);//得到每条直线的边界矩形
        if(!(x>=x1&&x<=x2&&y>=y1&&y<=y2))
    return FALSE; //如果点不在边界矩形内,继续判断下一个图形元素
    xx=PointLine(x,y,m_1X,m_1Y,m_2X,m_2Y);//得到点到直线距离
    if(xx<jl)//如果选中
    return TRUE;
    return FALSE;
    }
      

  3.   

    需要用一个窗口来表示这条线,使用SetWindowRgn来设置窗口的区域为略大于该线的平行四边形(足以包容整条线并显示拖动的端点)。
      

  4.   

    在CLine类中添加成员函数,这样就把划线的事件交给CLine类来处理,而不用交给OnDraw了
    void CLine::Draw(CDC* pDC)
    {
    //以下设置DC
    CPen pen(PS_SOLID, GetPenWidth(), GetPenColor()), *oldpen;
    oldpen = pDC->SelectObject(&pen);
    //以下移动直线
    pDC->MoveTo(m_x1, m_y1);
    pDC->LineTo(m_x2, m_y2); //以下恢复DC
    pDC->SelectObject(oldpen);
    pen.DeleteObject();//释放笔资源
    }在void CView::OnLButtonDown(UINT nFlags, CPoint point)和
    CView::OnLButtonUp(UINT nFlags, CPoint point) 和
    CView::OnMouseMove(UINT nFlags, CPoint point)中处理CLine::Draw(CDC* pDC)
      

  5.   

    arvid_gs(west),您的CLine如何对鼠标事件直接捕获,是不是鼠标事件还要在view中处理?
      

  6.   

    对鼠标事件直接捕获至少不是CLine要实现的东西,你可以做一个基类CBase,在这个类中添加比如线型颜色等等公共属性,添加Draw、Serialize、GetType(比如是园还是线)等等纯虚函数,这样的话就清晰了
      

  7.   

    你看看这个例子 sdk写的 图片 文字都是一个个对象 可以随意移动 改变颜色 没闪烁问题
    http://hot-yys.vicp.net/demo.rar