问题 限制表格

elais12

成员
已加入
2018年7月20日
留言内容
7
编程经验
Beginner
大家好

我是C#的新手,对表单有疑问。

我已经开发了一个模拟(在多个面板的帮助下)起重机的小应用程序。现在,我遇到了问题,如果我移动起重机(按相应的按钮,请参见下面的代码),起重机将离开表格并消失。
我如何避免这种情况,这意味着我可以限制表格,因此起重机到达例如左角等位置时不会离开表格。
谢谢您的帮助

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)
        {

        }
    }
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
发布代码时,请仅发布相关代码。您发布的与问题无关的每一段代码使我们更加难以确定问题出在哪里。一方面,我可以看到根本没有正文的方法声明。显然,它们完全无关紧要,因此它们的存在仅仅是噪音和干扰。确切地确定什么是不相关的并不总是那么容易,但是在这种情况下,您根本没有做出任何努力。请纠正。

在没有仔细研究代码的情况下,您似乎只是在询问如何确保更改控件的位置不会将该控件移到窗体的工作区之外。如果是这样,这很简单。您需要确保控件的“顶部”和“左侧”属性永远不会降到零以下,并且控件的“底部”和“右侧”属性绝不能超过表单的ClientSize.Height和ClientSize.Width。例如,假设您要在不关闭表单的情况下将控件向右移动最多100个像素。您可以这样做:
var distance = 100;
var proposedRight = control.Right + distance;

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

control.Left += distance;
 
最佳 底部