要截取一幅特征图像,进行学习匹配,经常会用到,那么我们经常会用到矩形框的鼠标拖拽行为,人们称其为橡皮筋技术,首先,我们先拖动一根线,其次再搞定其他。我们仍然遵循最轻量级代码化,以后不足,再扩充。
好,走起!
第一,声明一条线,并画出来,这一次,线中心多了一个小框,如下:
看代码: mg_line testline4 = new mg_line(new PointF(400, 400), new PointF(600, 400));//
PointF m_LineCenter = new PointF();
第二,初始化m_LineCenter在form()中,
m_LineCenter = new PointF(testline4.pt_start.X / 2 + testline4.pt_end.X / 2, testline4.pt_start.Y / 2 + testline4.pt_end.Y/ 2);
第三,在 pictureBox1_Paint()函数中画出先和小框,
g.DrawLine(new Pen(Brushes.Black), testline4.pt_start, testline4.pt_end);//
//lineCentre
g.DrawRectangle(new Pen(Brushes.Black), (int)m_LineCenter.X - 5, (int)m_LineCenter.Y - 5, 10, 10);
第四,关键步骤,当鼠标移动进入线中心小框,直线就跟随鼠标走路了,哈哈!这不拖动了?
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{ float a=m_LineCenter.X ;float b=m_LineCenter.Y;
if (e.X <= m_LineCenter.X + 5 && e.X >= m_LineCenter.X - 5
&& e.Y >= m_LineCenter.Y - 5 && e.Y <= m_LineCenter.Y + 5)//鼠标进入小矩形框,随鼠标改变线和小框
{
PointF temp = new PointF(a - e.X, b - e.Y);
testline4.直线平移(temp);//直线平移后改变,线中心也要改变
m_LineCenter = new PointF(testline4.pt_start.X / 2 + testline4.pt_end.X / 2, testline4.pt_start.Y / 2 + testline4.pt_end.Y / 2);
}
pictureBox1.Invalidate();
}
我这不是主流的橡皮筋技术,但解决问题就好。请你尝试解决以下问题:
1,鼠标移动太快,线移动跟不上,掉队了!未走到想要位置
2,进入小框,能否按下鼠标左键时移动,弹起鼠标左键时,释放线拖动?
3,能否在鼠标拖动释放期间,鼠标改变形状?
4,能否让直线拖动旋转呢?
5,你能否设计拖动一个矩形呢?