为什么我的控件不跟随鼠标?

问题描述 投票:0回答:1

所以我正在制作一个新脚本,并添加了基本的拖动功能,但是当我使用占位符图像测试它时,没有任何反应,它没有跟随我的鼠标,我不知道为什么。

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);
这是文件中的图像(如果有帮助的话): The placeholder image

提前致谢!

c# winforms controls
1个回答
0
投票

问题是

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.