读书人

怎么实现按上鼠标画任意方向矩形松开

发布时间: 2013-01-23 10:44:50 作者: rapoo

如何实现按下鼠标画任意方向矩形,松开矩形框消失
本帖最后由 hjx595 于 2013-01-08 14:46:58 编辑 我想实现按下鼠标画任意方向矩形,松开鼠标矩形框消失,并选中框内的控件,然后按需对齐。类似VS那样。
private bool MouseIsDown = false;
Rectangle MouseRect = Rectangle.Empty;
Point start, end;
Graphics g;
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
//MouseIsDown = false;
//MouseRect = Rectangle.Empty;

MouseIsDown = false;
g.Clear(Color.White);
g.Dispose();

}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (MouseIsDown)
{
Pen pen1 = new Pen(Color.White, 1);
pen1.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
Pen pen2 = new Pen(Color.Black, 1);
pen2.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
g.DrawRectangle(pen1, start.X, start.Y, Math.Abs(end.X - start.X), Math.Abs(end.Y - start.Y));
end.X = e.X;
end.Y = e.Y;
g.DrawRectangle(pen2, start.X, start.Y, Math.Abs(end.X - start.X), Math.Abs(end.Y - start.Y));

//end.X = e.X;
//end.Y = e.Y;
//Rectangle rect = this.RectangleToScreen(MouseRect);
//ControlPaint.DrawReversibleFrame(rect, Color.White, FrameStyle.Dashed);
//MouseRect.Width = end.X - start.X;
//MouseRect.Height = end.Y - start.Y;
//Rectangle rect1 = this.RectangleToScreen(MouseRect);


//ControlPaint.DrawReversibleFrame(rect1, Color.White, FrameStyle.Dashed);
}
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
g = this.panel1.CreateGraphics();
MouseIsDown = true;
start.X = e.X;
start.Y = e.Y;

//MouseIsDown = true;
//start.X = e.X;
//start.Y = e.Y;
//MouseRect = new Rectangle(start.X, start.Y, 0, 0);
}
我这里有2种不同的方法,第一种通过画笔,矩形框可以消失,但只能往右下角绘图;第二种是用rectangle,可逆但没有消失的方法。
有没有更好的方法啊,还有松开鼠标后控件怎么选中啊? c# winform object
[解决办法]
你应该将绘图的代码写到OnPaint事件中,鼠标的位置作为公共变量,需要重绘时调用 OnPaint事件所属组件的Invalidate事件
[解决办法]
画框

private void ctrlCtnr_MouseMove(object sender, MouseEventArgs e)
{
Control ctrlCtnr = sender as Control;

_MoveX = e.X;
_MoveY = e.Y;

if (_Draw)
{
//画框就是选择最小x和最小y为坐标 最大x-最小x为宽,最大y-最小y为高
int localx = _DownX > _MoveX ? _MoveX : _DownX;
int localy = _DownY > _MoveY ? _MoveY : _DownY;

//打开双缓存
BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;
BufferedGraphics myBuffer = currentContext.Allocate(ctrlCtnr.CreateGraphics(), ctrlCtnr.DisplayRectangle);

Graphics g = myBuffer.Graphics;
g.Clear(Button.DefaultBackColor);



Brush b = new SolidBrush(Color.FromArgb(100, Color.Red));
Pen p = new Pen(b);

//画框
g.DrawRectangle(p, localx, localy, Math.Abs(_DownX - _MoveX), Math.Abs(_DownY - _MoveY));

myBuffer.Render();
myBuffer.Dispose();
}
}



MouseUp 的时候看看控件是不是在框里,在就选择,不在就不选择,最后执行该控件的Invalidate();

可以这样判断控件在不在框里
画框.IntersectsWith(控件自己的框)

读书人网 >C#

热点推荐