我想实现的功能是这样的:
在FORMVIEM选中任意两点,然后在两点间连一条线(斜的),希望这条线和按钮一样可以点击,
不知道能不能更改按钮的样式,画成细长的矩形,但是不知道能不能允许这个矩形是倾斜的,而且由于线的长度是不一样的,所以感觉很麻烦,请赐教,谢谢

解决方案 »

  1.   

    1:你定义一个新的类可以叫做CLine,然后定义其起点、终点、线宽颜色等属性。
    2:处理窗体的绘制消息来绘制这条线。
    3:处理鼠标事件,比如MouseDown、MouseMove、MouseUp等消息来相应的修改CLine的起点、终点坐标并调用Invalidate方法来更新线的绘制。当然这里有一个前提是判断鼠标按下并在线的“区域”之内。
    4:判断鼠标按下并在线区域之内可以使用数学公式点到线的距离,可以设置一个常数,比如5,如果距离小于+-5则表示在线上。否则不在线上。5:如此而已。
      

  2.   

    给你写了一个类的框架,你试试填入代码。其中比较关键的范围判断,我给你写了一个示例。class CLine : public CObject
    {
    DECLARE_SERIAL(CLine)
    public:
    CLine ();
    CLine (CPoint start,CPoint end);
    virtual ~CLine ();
    public:
    /** 设置选中状态 */
    virtual void SetSelect(BOOL bSelect); /** 绘制函数 */
    virtual void Draw(CView* pView, CDC* pDC); /** 绘制选中框 */
    virtual void DrawSelect(); /** 设置选中时光标类型 */
    virtual BOOL OnSetCursor(CView* pView,const CPoint& point); /** 返回光标类型 */
    virtual HCURSOR GetHandleCursor(int nHandle); /** 鼠标左键弹起消息 */
    virtual void OnLButtonUp(CView* pView, UINT nFlags, const CPoint& point); /** 鼠标左键按下消息 */
    virtual void OnLButtonDown(CView* pView, UINT nFlags, const CPoint& point); /** 鼠标双击消息 */
    virtual void OnLButtonDblClk(CView* pView, UINT nFlags, const CPoint& point); /** 鼠标移动消息 */
    virtual void OnMouseMove(CView* pView, UINT nFlags, const CPoint& point);
    protected:
    /** 位置判断 */
    virtual int HitTest(CView* pView,const CPoint& point); /** 属性设置 */
    virtual BOOL Properties(CView* pView); /** 更新对象 */
    virtual void InvalObj(CView* pView);
    public:
    /** 起始点 */
    CPoint m_Start; /** 结束点 */
    CPoint m_End; /** 鼠标按下位置 */
    CPoint m_Down; /** 鼠标上次位置 */
    CPoint m_Last; /** 是否选中 */
    Bool m_Select;
    };.cppint CLine ::HitTest(CView* pView,const CPoint& point)
    {
    ASSERT_VALID(this);
    ASSERT(pView != NULL); CRect rc = GetSelectRect(); //根据起始点、结束点,划定一个合理的响应范围矩形
    if (rc.PtInRect(point)) // 判断你现在鼠标的点是否在相应范围内
    return 1;       // 在的话返回 1
    return -1;             // 不在返回-1
    }