Изменение размера элементов управления с помощью мыши - все направления - Проблема с изменением размера до минимального размера элемента управления - PullRequest
0 голосов
/ 18 июня 2020

Я использую элементы управления с изменяемым размером при перетаскивании мышью. Проблема в том, что элемент управления, который в моем случае является панелью, изменяет размер до минимального размера, который я установил, и это хорошо, но когда он изменяется до минимального размера, он начинает перемещаться в сторону, куда идет мышь.

Мой вопрос состоит в том, как предотвратить перемещение панели при изменении размера, когда она достигает минимального размера, установленного на.

Проблема : панель перемещается вслед за мышью, когда она достигает минимального размера.

Я использую часть этого кода https://www.codeproject.com/Tips/709121/Move-and-resize-controls-on-a-form-at-runtime-with

Если вы установите минимальный размер для некоторых панелей в этом примере, вы можете воспроизвести Проблема у меня есть.

Файл с исходным кодом в статье сделан в Visual Studio 2010. Когда я пытаюсь его открыть, он говорит «Нет лицензии». Я отредактировал файл .sln в блокноте и изменил # Visual Studio 2010 на # Visual Studio 2019 , и его можно открыть в Visual Studio 2019.

Модифицированный Класс из Артикула:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Move_Resize_Controls
{
    class Move_Resize
    {
        // Event Sensors
        private static bool _moving;  
        private static bool _startMoveOrResize;  
        private static bool _resizing;
        private static Point _cursorStartPoint;
        private static Point _last_resize;
        private static Point _last_resize_location;
        private static Size _currentControlStartSize;


        // Edge Sensors
        private static bool MouseIsInLeftEdge { get; set; }
        private static bool MouseIsInRightEdge { get; set; }
        private static bool MouseIsInTopEdge { get; set; }
        private static bool MouseIsInBottomEdge { get; set; }

        // Control Settings
        internal static void Init(Control control, Control container)
        {
            _moving = false;
            _resizing = false;
            _cursorStartPoint = Point.Empty;
            MouseIsInLeftEdge = false;
            MouseIsInLeftEdge = false;
            MouseIsInRightEdge = false;
            MouseIsInTopEdge = false;
            MouseIsInBottomEdge = false;

            control.MouseMove += (sender, e) => MoveControl(container, e);
            control.MouseUp += (sender, e) => MouseUP_Control(container, e);
            control.MouseDown += (sender, e) => MouseDown_Control(container, e);
           
        }

        //:-:-:-: Events :-:-:-: ::START::----------------------------------------------------

         // ::Move::
         private static void MoveControl(Control control, MouseEventArgs e)
         {
         

            if(_startMoveOrResize != true)
            {
                //Edge Properties
                Update_Edge_Properties(control, new Point(e.X, e.Y)); // Check if cursor is in some of the Resize Region
                UpdateCursor(control); // Update the cursor Type "Cursor image"
            }

            else // If MouseDown == true
            {

                //Moving
                if ((MouseIsInLeftEdge || MouseIsInRightEdge || MouseIsInTopEdge || MouseIsInBottomEdge) == false ) // If mouse is not in resize area
                {
                    _moving = true; // Moving ís true

                    // Moving panel on Mouse Move
                    int X = (e.X - _cursorStartPoint.X) + control.Left;
                    int Y = (e.Y - _cursorStartPoint.Y) + control.Top;
                    control.Location = new Point(X,Y);  
                }


                // Resize
                else // if Mouse is down and it is in the resize area "Resize panel on mouse move"
                {

                    //control.Size == control.MinimumSize && control.Size.Width /*_currentControlStartSize.Width < control.Size.Width && _currentControlStartSize.Height < control.Size.Height &&*/


                    if (MouseIsInLeftEdge) // Left Side
                    {
                        if (MouseIsInTopEdge) // "Top Left Corner" Left Side and Top Side are only intersecting with eachother in the top left
                        {
                            control.Width -= (e.X - _cursorStartPoint.X);
                            control.Left += (e.X - _cursorStartPoint.X);
                            control.Height -= (e.Y - _cursorStartPoint.Y);
                            control.Top += (e.Y - _cursorStartPoint.Y);
                        }
                        else if (MouseIsInBottomEdge) // Bottom Left Corner
                        {

                            control.Width -= (e.X - _cursorStartPoint.X);
                            control.Left += (e.X - _cursorStartPoint.X);
                            control.Height = (e.Y - _cursorStartPoint.Y) + _currentControlStartSize.Height;

                            
                        }
                        else // Left
                        {

                            if (control.Size.Width == control.MinimumSize.Width)
                            {
                                _last_resize_location = control.Location;

                            }


                            control.Width -= (e.X - _cursorStartPoint.X);
                            control.Left += (e.X - _cursorStartPoint.X);


                            //Down
                            if (e.X < _last_resize.X && control.Size.Width == control.MinimumSize.Width)
                            {

                                control.BackColor = Color.Red;
                               

                            }

                            else if (e.X > _last_resize.X)
                            {

                                control.BackColor = Color.Blue;
                          
                              
                            }


                            _last_resize = new Point(e.X, e.Y);

                        }
                    }

                    else if (MouseIsInRightEdge) //Right
                    {
                        if (MouseIsInTopEdge)  // Top Right Corner
                        {
                            control.Width = (e.X - _cursorStartPoint.X) + _currentControlStartSize.Width;
                            control.Height -= (e.Y - _cursorStartPoint.Y);
                            control.Top += (e.Y - _cursorStartPoint.Y);

                        }
                        else if (MouseIsInBottomEdge) //Bottom Right Corner
                        {
                            control.Width = (e.X - _cursorStartPoint.X) + _currentControlStartSize.Width;
                            control.Height = (e.Y - _cursorStartPoint.Y) + _currentControlStartSize.Height;
                        }
                        else // Right
                        {
                            control.Width = (e.X - _cursorStartPoint.X) + _currentControlStartSize.Width;
                        }
                    }

                    else if (MouseIsInTopEdge) // Top
                    {
                        control.Height -= (e.Y - _cursorStartPoint.Y);
                        control.Top += (e.Y - _cursorStartPoint.Y);
                    }
                    else if (MouseIsInBottomEdge) // Bottom
                    {
                        control.Height = (e.Y - _cursorStartPoint.Y) + _currentControlStartSize.Height;
                    }
                }


            }
         }
           
        // ::MouseUp::
        private static void MouseUP_Control(Control control, MouseEventArgs e)
        {

            _moving = false;
            _resizing = false;
            _startMoveOrResize = false;
        }
       




        // ::MouseDown::
        private static void MouseDown_Control(Control control, MouseEventArgs e)
        {
            _currentControlStartSize = control.Size;
            _cursorStartPoint = e.Location;
            _startMoveOrResize = true;
        }


        //:-:-:-: Events :-:-:-: ::END::----------------------------------------------------





        // Update Edge Properties
        private static void Update_Edge_Properties(Control control, Point mouseLocationInControl)
        {

            if(_moving == true)
            {
                return;
            }


            MouseIsInLeftEdge = Math.Abs(mouseLocationInControl.X) <= 10; // Left
            MouseIsInRightEdge = Math.Abs(mouseLocationInControl.X - control.Width) <= 10; // Right
            MouseIsInTopEdge = Math.Abs(mouseLocationInControl.Y) <= 10; // Top
            MouseIsInBottomEdge = Math.Abs(mouseLocationInControl.Y - control.Height) <= 10; // Bottom
       
          
        }



 
        // Currsor Icon
        private static void UpdateCursor(Control control)
        {
            // If Moving "Return"   // Dont check for changing cursor image
            if(_moving == true)
            {
                return;
            }



            if (MouseIsInLeftEdge)
            {
                if (MouseIsInTopEdge)
                {
                    control.Cursor = Cursors.SizeNWSE;   // Change Currsor type to Diagonal with two arrows
                }
                else if (MouseIsInBottomEdge)
                {
                    control.Cursor = Cursors.SizeNESW;
                }
                else
                {
                    control.Cursor = Cursors.SizeWE;
                }
            }



            else if (MouseIsInRightEdge)
            {
                if (MouseIsInTopEdge)
                {
                    control.Cursor = Cursors.SizeNESW;
                }
                else if (MouseIsInBottomEdge)
                {
                    control.Cursor = Cursors.SizeNWSE;
                }
                else
                {
                    control.Cursor = Cursors.SizeWE;
                }
            }


            else if (MouseIsInTopEdge || MouseIsInBottomEdge)
            {
                control.Cursor = Cursors.SizeNS;
            }
            else
            {
                control.Cursor = Cursors.Default;
            }
        }
    }
}
...