Question Limit Forms

elais12

Member
Joined
Jul 20, 2018
Messages
7
Programming Experience
Beginner
Hello together

I'm a Newbie on C# and have a question about Forms.

I have developed a littel App wich is simulating (with the help of multiple panels) a crane. Now I have the problem, if i move the crane (pressing the approriate buttons see code below) the crane will leave the form and it's gone.
How can I avoid this, which means how i can limit the Form, so the crane won't leave the Form if it reaches for example the left corner etc.
Thank you for your help

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading; // benötigt für die Pausefunktion siehe weiter unten
using System.Threading.Tasks;
using System.Windows.Forms;
/* virtueller Kran realisiert mit Hilfe von verschiebbaren Panels */
/* (C) 2018 by E.Altherr
/* Version 2: fragt nun den Benutzer ob er das Programm wirklich beenden will */
/* Version 2.1: hat nun ein schickes pebe Logo eingebaut das mit einem Button getimt nach rechts bewegt werden kann */
/* Version 2.11: nun kann das Logo, sprich die "Last" auch nach links bewegt werden ebenfalls getimt */
/* Version 2.12: durch einen Klick auf den Button Last abwerfen kann diese auch ggf. abgeworfen werden */
/* Version 2.13: nun kann die Last auch wieder an den Haken angehängt werden */
/* Version 2.14: auch können nun die Links/Rechts Bewegungen der Last gestoppt werden bei Bedarf */
/* Version 2.15: keine Aenderungen */
/* Version 2.16: Timer für "Lastabwurf" langsamer eingestellt,d.h. einen höheren Intervall gesetzt */
/* Version 2.17: kleines Fenster implementiert dass ne kurze Startmeldung anzeigt  und dann selber wieder verschwindet (realisiert mit einem 2. Form)*/
/*geplant:Abwurf der Last und Bewegung des Krans nur innerhalb des Forms momentan geht beides nicht */
namespace Kran
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /* die Panels, je nachdem welcher Button angeklickt wird, entsprechend bewegen */

        private void Hackenaus_Click(object sender, EventArgs e)
        {
            panel4.Height = panel4.Height + 10;
        }

        private void panel4_Paint(object sender, PaintEventArgs e)
        {

        }

        private void Hackenein_Click(object sender, EventArgs e)
        {
            panel4.Height = panel4.Height - 10;
        }

        private void panel3_Paint(object sender, PaintEventArgs e)
        {

        }

        private void Auslegerein_Click(object sender, EventArgs e)
        {
            panel3.Width = panel3.Width - 10;
            panel3.Location = new Point(panel3.Location.X + 10, panel3.Location.Y);
            panel4.Location = new Point(panel4.Location.X + 10, panel4.Location.Y);
        }

        private void Auslegeraus_Click(object sender, EventArgs e)
        {
            panel3.Width = panel3.Width + 10;
            panel3.Location = new Point(panel3.Location.X - 10, panel3.Location.Y);
            panel4.Location = new Point(panel4.Location.X - 10, panel4.Location.Y);

        }

        private void Kranrechts_Click(object sender, EventArgs e)
        {
            panel1.Location = new Point(panel1.Location.X + 10, panel1.Location.Y);
            panel2.Location = new Point(panel2.Location.X + 10, panel2.Location.Y);
            panel3.Location = new Point(panel3.Location.X + 10, panel3.Location.Y);
            panel4.Location = new Point(panel4.Location.X + 10, panel4.Location.Y);
        }

        private void Kranlinks_Click(object sender, EventArgs e)
        {
            panel1.Location = new Point(panel1.Location.X - 10, panel1.Location.Y);
            panel2.Location = new Point(panel2.Location.X - 10, panel2.Location.Y);
            panel3.Location = new Point(panel3.Location.X - 10, panel3.Location.Y);
            panel4.Location = new Point(panel4.Location.X - 10, panel4.Location.Y);
        }

        private void Kranein_Click(object sender, EventArgs e)
        {
            panel2.Height = panel2.Height - 10;
            panel2.Location = new Point(panel2.Location.X, panel2.Location.Y + 10);
            panel3.Location = new Point(panel3.Location.X, panel3.Location.Y + 10);
            panel4.Location = new Point(panel4.Location.X, panel4.Location.Y + 10);
        }

        private void Kranaus_Click(object sender, EventArgs e)
        {
            panel2.Height = panel2.Height + 10;
            panel2.Location = new Point(panel2.Location.X, panel2.Location.Y - 10);
            panel4.Location = new Point(panel4.Location.X, panel4.Location.Y - 10);
            panel3.Location = new Point(panel3.Location.X, panel3.Location.Y - 10);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            /* Dialogbox beim Beenden anzeigen */
            /* dann mit einer If Schleife den Status abfragen und je nach Auswahl reagieren */

            DialogResult result = MessageBox.Show("Möchten Sie wirklich beenden?", "Beenden?",
            MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
            if (result == DialogResult.Yes)
            {
                // bei Auswahl Ja = Programm schliessen  
                Close();
            }
            else if (result == DialogResult.No)
            {
                //code for No
                // Ansonsten nix tun und das Programm normal weiterlaufen lassen
            }
            else if (result == DialogResult.Cancel)
            {
                //dito beim Drücken des Cancel Buttons
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        /* hier können allfällige Startmeldungen eingeblendet werden bevor das eigentliche Windows Forms basierte Programm startet */
        /* um eine buttonlose Startmeldung anzzuzeigen wurde ein 2. Form kreiert */

        {
            Form2 frm = new Form2();   // Objekt von Form2 erstellen:
            frm.Show(); // Form2 anzeigen, da die Messagenbox diese Methode nicht unterstützt,d.h. es gibt keine buttonlose Messagebox
            Thread.Sleep(1000);      // und ne kurze Pause einlegen und dann 
            frm.Hide(); // gleich wieder schliessen und dann das Programm starten
        }

        private void panel5_Paint(object sender, PaintEventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            // zuguter Letzt das Ganze noch mit dem pebe Logo machen dass durch den Timer automatisch nach rechts bewegt wird. 
            timer1.Enabled = true;

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            panel5.Location = new Point(panel5.Location.X + 5, panel5.Location.Y); /* Panel wandert langsam nach rechts bis der User den Stop Button drückt */
        }

        private void button3_Click(object sender, EventArgs e)
        {
            timer3.Enabled = false; /* Stoppt die Timer */
        }

        private void button4_Click(object sender, EventArgs e)
        {
            timer2.Enabled = true;
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            panel5.Location = new Point(panel5.Location.X - 5, panel5.Location.Y); /* Panel wandert langsam nach links bis der User den Stop Button drückt */
        }

        private void button5_Click(object sender, EventArgs e)
        {
            timer3.Enabled = true; /* Timer für schnelle Bewegung setzen */
                                   //timer3.Enabled = false; /* damit das "Panel" nicht einfach so verschwindet wird nach der Bewegung der Timer sofort gestoppt */
                                   // funktioniert noch nicht in Planung
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            panel5.Location = new Point(panel5.Location.X, panel5.Location.Y + 5); /* durch den Timer3 wird das Logo Panel bzw. die Last abgeworfen Merke: je höher der Intervall je langsamer läuft der Timer ab */

        }

        private void button3_Click_1(object sender, EventArgs e)
        {
            timer4.Enabled = true; /* Timer für langsame Bewegung setzen, je höher der Intervall je langsamer läuft der Timer */
        }

        private void timer4_Tick(object sender, EventArgs e)
        {
            panel5.Location = new Point(panel5.Location.X, panel5.Location.Y - 5); /* die Last wieder zum Abwurfhaken bewegen */
        }

        private void button6_Click(object sender, EventArgs e)
        {
            timer4.Enabled = false; /* wenn die Last beim Haken angekommen ist, das Anhängen stoppen */
        }

        private void button7_Click(object sender, EventArgs e)
        {
            /* Lastbewegung nach links oder rechts stoppen */
            timer1.Enabled = false;  // Durch Klicken auf den Button werden der timer1+2 gestoppt */
            timer2.Enabled = false;
        }

        private void panel2_Paint(object sender, PaintEventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }
    }
}
 

jmcilhinney

C# Forum Moderator
Staff member
Joined
Apr 23, 2011
Messages
4,250
Location
Sydney, Australia
Programming Experience
10+
When posting code, please post only RELEVANT code. Every bit of code you post that is irrelevant to the problem makes it more difficult for us to identify where the issue is. For one thing, I can see method declarations there with no body at all. Obviously they are all completely irrelevant so their presence is just noise and a distraction. It's not always easy to determine exactly what's relevant and what's not but you've not made any effort at all to do so on this occasion. Please rectify that.

Without having looked closely at the code, it seems like you are simply asking how make sure that changing the Location of a control doesn't move that control outside the form's client area. If so, it's simple arithmetic. You need to ensure that the Top and Left properties of the control never fall below zero and the Bottom and Right properties of the control never exceed the ClientSize.Height and ClientSize.Width of the form. For instance, let's say that you want to move a control up to 100 pixels to the right without going off the form. You might do this:
var distance = 100;
var proposedRight = control.Right + distance;

if (proposedRight > ClientSize.Width)
{
    distance -= proposedRight - ClientSize.Width;
}

control.Left += distance;
 
Top Bottom