我想在屏幕上移动一个矩形。 这是我同时做的代码:
internal class GraphicContainer : Control
{
//---------------------METHODS---------------------
public GraphicContainer(Control control, string text, int left, int top)
: base(control, text, left, top, 400, 200)
protected override void OnPaint(PaintEventArgs pe)
{
// Call the OnPaint method of the base class.
base.OnPaint(pe);
// Declare and instantiate a new pen.
Pen pen = new Pen(Color.Fuchsia, 15);
SolidBrush myBrush= new System.Drawing.SolidBrush(Color.HotPink);
// Draw an aqua rectangle in the rectangle represented by the control.
//pe.Graphics.DrawRectangle(pen, new Rectangle(this.Location,this.Size));
Rectangle blublublu = new Rectangle(this.Location, this.Size - new Size(25, 25));
pe.Graphics.DrawRectangle(pen,blublublu);
pe.Graphics.FillRectangle(myBrush,blublublu);
}
protected override void OnMouseMove(MouseEventArgs e)
{
}
protected override void OnClick(EventArgs e)
{
}
}
我搜索了很多,并没有找到我应该写的代码" OnMouseMove"和" OnClick"为了让鼠标移动。
答案 0 :(得分:0)
让blublublu成为一个领域。
您必须使用MouseMove
,MouseUp
,MouseDown
:
Rectangle blublublu = new Rectangle(...); // possibly init in constructor
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Capture = true;
_x = e.X; // remember coords
_y = e.Y;
}
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
Capture = false;
base.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
blublublu.X += _x - e.X; // not tested, maybe use Rectangle.Offset or create a new Rectangle
blublublu.Y += _y - e.Y;
Invalidate();
}
}
当鼠标停止时,你捕获它(即使鼠标移动到控制之外也接收鼠标移动事件)并记住坐标。在鼠标移动过程中,您可以通过差异(保存鼠标位置减去当前值)更改blublublu的当前坐标并调用Invalidate
。
答案 1 :(得分:0)
您可以制作Location
变量并使鼠标移动控件无效。此外,只有在按下鼠标左键时才会发生这种情况
请注意,我不会覆盖OnMouseMove
,而是通过添加其他处理程序来订阅该事件。
Point mouseLocation;
public GraphicContainer(Control control, string text, int left, int top)
: base(control, text, left, top, 400, 200) {
//prevents flickering
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
//subscribes to mousemove
this.MouseMove += (obj,e) => {
//only when left mousebutton is pressed
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
//update the location
mouseLocation = e.Location;
//invalidate the control
this.Invalidate();
}
};
}
protected override void OnPaint(PaintEventArgs pe)
{
// Call the OnPaint method of the base class.
base.OnPaint(pe);
// Declare and instantiate a new pen.
Pen pen = new Pen(Color.Fuchsia, 15);
SolidBrush myBrush = new System.Drawing.SolidBrush(Color.HotPink);
// Draw an aqua rectangle in the rectangle represented by the control.
Rectangle blublublu = new Rectangle(mouseLocation, this.Size - new Size(25, 25));
pe.Graphics.DrawRectangle(pen, blublublu);
pe.Graphics.FillRectangle(myBrush, blublublu);
}
protected override void OnMouseMove(MouseEventArgs e)
{
//nothing here
}
请注意,我在构造函数中添加了this.SetStyle(...)
,因为这样可以防止移动矩形时出现闪烁。我还在this.Location
方法中将mouseLocation
更改为OnPaint
。