winforms 释放并移动鼠标后,C#可拖动Map重置为默认值

5ssjco0h  于 2022-12-14  发布在  C#
关注(0)|答案(1)|浏览(224)

上周我一直在尝试修复一个错误。
我有一个面板,在这个面板里面有一个图片框(Map)。
每当您按下鼠标按钮并将其移动到某个位置时,它会移动贴图,但每当您释放鼠标按钮并再次按下鼠标按钮并移动它时,它会返回到贴图的默认位置(但仍然可以拖动)。
我需要它是,每当有人释放按钮按下,并点击和移动它再次进行的立场,它是目前。
我确信它与我的MouseMove事件有关,我已经尝试了很多方法,但都无法修复它。
下面是我为MouseUpMouseDownMouseMove事件编写的代码。

private bool Dragging;
private Point lastLocation;

private void countryMapImage_MouseUp(object sender, MouseEventArgs e)
{
    Dragging = false;
    lastLocation = e.Location;
}

private void countryMapImage_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Dragging = true;
        lastLocation = e.Location;
    }
}

private void countryMapImage_MouseMove(object sender, MouseEventArgs e)
{
    if (Dragging == true)
    {
        int dx = e.X - lastLocation.X;
        int dy = e.Y - lastLocation.Y;
        countryMapImage.Padding = new Padding(Padding.Left + dx, Padding.Top + dy, Padding.Right - dx, Padding.Bottom - dy);
        countryMapImage.Invalidate();
    }
}

非常感谢你的帮助!
我尝试过改变mousemove padding事件、mousedown和mouseup事件的一些值,但没有解决问题。我已经尝试过寻找一些答案,但没有找到任何解决问题的答案。

3df52oht

3df52oht1#

试试这个:当用户单击Map时,捕获光标的位置(在“screen”坐标中)以及Map控件的当前位置。现在,当您移动鼠标(且仅当LButton按下时)计算当前光标位置的增量(在“屏幕”坐标系中)相对于光标位置捕捉到的MouseDown事件.然后,将Map控件的新位置设置为在MouseDown事件中捕获的位置加上delta的总和。
使其正常工作的一个关键是获取处理程序事件的e.Location,并将该点转换为 * 相对于发送者 * 的屏幕坐标。

public MainForm()
{
    InitializeComponent();
    countryMapImage.MouseMove += onMapMouseMove;
    countryMapImage.MouseDown += onMapMouseDown;
}

Point
    // Where's the cursor in relation to screen when mouse button is pressed?
    _mouseDownScreen = new Point(),
    // Where's the 'map' control when mouse button is pressed?
    _controlDownPoint = new Point(),
    // How much has the mouse moved from it's original mouse-down location?
    _mouseDelta = new Point();

private void onMapMouseDown(object sender, MouseEventArgs e)
{
    if (sender is Control control)
    {                
        _mouseDownScreen = control.PointToScreen(e.Location);
        Text = $"{_mouseDownScreen}";
        _controlDownPoint = countryMapImage.Location;
    }
}

private void onMapMouseMove(object sender, MouseEventArgs e)
{
    if (MouseButtons.Equals(MouseButtons.Left))
    {
        if (sender is Control control)
        {
            var screen = control.PointToScreen(e.Location);
            _mouseDelta = new Point(screen.X - _mouseDownScreen.X, screen.Y - _mouseDownScreen.Y);
            Text = $"{_mouseDownScreen} {screen} {_mouseDelta}";
            var newControlLocation = new Point(_controlDownPoint.X + _mouseDelta.X, _controlDownPoint.Y + _mouseDelta.Y);
            if(!countryMapImage.Location.Equals(newControlLocation))
            {
                countryMapImage.Location = newControlLocation;
            }
        }
    }
}

在这个简单的场景中,不需要处理MouseUp事件。

相关问题