我想实现的功能是这样的:
在FORMVIEM选中任意两点,然后在两点间连一条线(斜的),希望这条线和按钮一样可以点击,
不知道能不能更改按钮的样式,画成细长的矩形,但是不知道能不能允许这个矩形是倾斜的,而且由于线的长度是不一样的,所以感觉很麻烦,请赐教,谢谢
在FORMVIEM选中任意两点,然后在两点间连一条线(斜的),希望这条线和按钮一样可以点击,
不知道能不能更改按钮的样式,画成细长的矩形,但是不知道能不能允许这个矩形是倾斜的,而且由于线的长度是不一样的,所以感觉很麻烦,请赐教,谢谢
2:处理窗体的绘制消息来绘制这条线。
3:处理鼠标事件,比如MouseDown、MouseMove、MouseUp等消息来相应的修改CLine的起点、终点坐标并调用Invalidate方法来更新线的绘制。当然这里有一个前提是判断鼠标按下并在线的“区域”之内。
4:判断鼠标按下并在线区域之内可以使用数学公式点到线的距离,可以设置一个常数,比如5,如果距离小于+-5则表示在线上。否则不在线上。5:如此而已。
{
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
}