所以我正在制作一个新脚本,并添加了基本的拖动功能,但是当我使用占位符图像测试它时,没有任何反应,它没有跟随我的鼠标,我不知道为什么。
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace mynamespace._2D
{
public sealed class WaterBucket : Control
{
public int Water { get; set; } = 100;
public int Capacity { get; set; } = 100;
public Image Sprite { get; set; }
public Window program;//The main form.
private bool IsDown = false;
public bool HitBox { get; set; } = false;
public Point ImageSize { get; set; }
//Constructor...
private void Program_MouseMove(object? sender, MouseEventArgs e)
{
if (!Enabled) return;
if (!IsDown) return;
Location = e.Location;
}
protected override void OnMouseUp( MouseEventArgs e)
{
if (!Enabled) return;
IsDown = false;
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (!Enabled) return;
IsDown = true;
}
protected override void OnPaint(PaintEventArgs e)
{
if (!Visible) return;
Graphics g = e.Graphics;
g.DrawImage(Sprite,ClientRectangle);
if (!HitBox) return;
using Pen pen = new(Color.LightBlue, 5);
g.DrawRectangle(pen, new(new(ClientRectangle.Location.X + 5/2,ClientRectangle.Location.Y+5/2), new(ClientRectangle.Width - 5/2,ClientRectangle.Height-5/2)));
}
// Rest of code...
}
}
所以我尝试使用像
Rectangle rect = new(Location,Size);
这样的普通矩形,但它没有做任何事情。
我也曾经做过这些检查:if (IsDown) return; IsDown = true;
但是删除这些也没有帮助。
由于某种原因 CanSelect
和 CanFocus
是 readonly
所以我不知道它们是否真的是真的。
我Enabled = true;
这样我就可以确定它已启用。
但没有任何效果,我尝试添加调试语句,但我的输出不起作用。
这也是代码中的占位符图像:
public static Image PlaceHolder { get; } = Image.FromFile(Path.Combine(AppContext.BaseDirectory, "Images", "PlaceHolderImage.png"));
这就是创作:
WaterBucket bucket = new(150,150,Program.PlaceHolder,program);
这是文件中的图像(如果有帮助的话):
提前致谢!
问题是
Program_MouseMove
附加到哪个事件?
我把它改成了
protected override void OnMouseMove(MouseEventArgs e)
{
if (!Enabled) return;
if (!IsDown) return;
Location = ((Form)Parent).PointToClient(this.PointToScreen(e.Location));
}
我还首先将
WaterBucket
本地的鼠标坐标转换为屏幕坐标,然后将其转换回 WaterBucket
父级(可能是表单)的本地坐标。
这使得控件的左上角成为鼠标移动到的位置。这并不理想。如果您首先单击控件内的某个位置,则应保持此相对位置。您可以通过记住类字段 (
WaterBucket
) 中的起始位置(相对于 _delta
)来实现此目的。我还将这个 Point
转换为 Size
,稍后可以从另一个位置减去。
// Only showing code relevant to moving this Control with the mouse.
public sealed class WaterBucket : Control
{
private bool IsDown = false;
private Size _delta;
protected override void OnMouseMove(MouseEventArgs e)
{
if (!Enabled) return;
if (!IsDown) return;
Location = Parent.PointToClient(PointToScreen(e.Location)) - _delta;
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (!Enabled) return;
IsDown = false;
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (!Enabled) return;
IsDown = true;
_delta = (Size)e.Location;
}
}