Panel im Formular Zentrieren

BugBott

Grünschnabel
Hallo Leute,
hört sich vielleicht etwas blöd an, aber:
Gibt es eine einfache und schnelle Lösung wie man ein Panel in einem Formular zentriert?

Ich wollte das Formular maximiert anzeigen (was auch funktioniert) und dann die Werte Width und Height des Formulars auslesen und dadurch die Location / Point - Werte für das Panel ausrechnen, aber das funktioniert leider nicht, weil Width und Height des Formulares nur die Werte beinhalten die das Formulare hätte wenn das Formular "Normal"-groß ist, also nicht Maximiert.

Achso, nur nebenbei: Ich benutze keine IDE, sondern tippe jede Zeile, deswegen bitte keine Tipps a la "Rechte Maustaste im Designer und dann Zentrieren anklicken" ! :)

Danke schön!
 
Moin :)

aber das funktioniert leider nicht, weil Width und Height des Formulares nur die Werte beinhalten die das Formulare hätte wenn das Formular "Normal"-groß ist, also nicht Maximiert.

Bist dir ganz sicher?
Bei mir funktioniert es wunderbar...

Code:
Me.Panel1.Left = Me.Width / 2 - Panel1.Width / 2
Me.Panel1.Top = Me.Height / 2 - Panel1.Height / 2

Nur mal eben runtergeschrieben, aber das funktioniertr bei mir ^^
 
Hi SoL_Psycho,
leider muss ich dich enttäuschen, bei mir will das einfach nit funktionieren!
Wenn ich die Eigenschaften Width und Height des Formulares ausgebe, bekomm ich die Werte 300 und 300 ausgegeben, und das obwohl das Fenster Maximiert ist.
Und wohlbetont setze ich den WindowState auf FormWindowState.Maximized bevor ich die Zeilen ausgebe. Die Reihenfolge stimmt schon.

Und die Formeln sollten natürlich funktionieren, ergeben schließlich Sinn... wenn die Eigenschaften Width und Height wirklich auf 1280 x 1024 wären....

Gibt es denn keine einfachere Möglichkeit Steuerelemente zu Zentrieren?

Gruß,
BugBott
 
Moin :)

Hmm, dann tuts mir leid... :rolleyes:
Bei mir funktioniert es so und wenn ich die Breite / Höhe ausgeben lasse, bekomme ich auch (rechnerisch) richtige Werte...
Ka, worans bei dir scheitert :(
 
Hallo BugBott!

@No IDE:
Du sagst Du hast keine IDE? Das ist schade. Wobei es doch so viele kostenlose IDEs gibt.
[thread=154112]Freie IDEs für C# - Thread[/thread]
Eclipse hat leider keinen Debugger.
Wie es bei den M$ VisualStudio Express Editions ausschaut kann ich Dir nicht sagen,
gehe aber mal von aus das die einen haben.

Ich würde sagen das Du ohne IDE aufgeschmissen bist. Besonders beim Designen. ;)

@Topic:
BugBott hat gesagt.:
Wenn ich die Eigenschaften Width und Height des Formulares ausgebe, bekomm ich die Werte 300 und 300 ausgegeben, und das obwohl das Fenster Maximiert ist. Und wohlbetont setze ich den WindowState auf FormWindowState.Maximized bevor ich die Zeilen ausgebe. Die Reihenfolge stimmt schon.
Wenn das so ist, gibst Du die Werte irgend eines Controls aus, welches sich in deiner Form befindet.
Poste doch mal den Code mit dem Du die Eigenschaften ausgibst.

Btw würd ich das Panel im Form.SizeChanged Event zentrieren.

MfG, cosmo
 
Hallo,
das ist mein Quelltext; Hab ich schon erwähnt das ich mit C# Programmiere?

Code:
using System;
using System.Windows.Forms;
using System.Drawing;
using BugSoft;

public class GCards : System.Windows.Forms.Form
{
  private Button button_login;
  private Button button_settings;
  private Button button_exit;
  private Panel panel_main_menu;

  [STAThread]
  public static void Main(string[] args)
  {
    Application.Run(new GCards())
  }

  private GCards()
  {
    Init();
  }

  private void show_settings()
  {
  }
  private void exit_game()
  {
  }
  private void show_login()
  {
  }

  private void Init()
  {
    this.WindowState = FormWindowState.Maximized;
    this.button_login = new Button();
    this.button_settings = new Button();
    this.button_exit = new Button();
    this.panel_main_menu = new Panel();

    this.button_login.Location = new Point(10,10);
    this.button_login.Size = new Size(90,20);
    this.button_login.Name = "button_login";
    this.button_login.Text = "Anmelden";

    this.button_settings.Location = new Point(10,40);
    this.button_settings.Size = new Size(90,20);
    this.button_settings.Name = "button_settings";
    this.button_settings.Text = "Einstellungen";

    this.button_exit.Location = new Point(10,70);
    this.button_exit.Size = new Size(90,20);
    this.button_exit.Name = "button_name";
    this.button_exit.Text = "Beenden";


    this.panel_main_menu.Size = new Size(110,100);
    Console.WriteLine("Formbreite: {0} | Formhöhe: {1}",this.Width, this.Height);
    this.panel_main_menu.Left = this.Width / 2 - this.panel_main_menu.Width / 2;
    this.panel_main_menu.Top = this.Height / 2 - this.panel_main_menu.Top / 2;
    Console.WriteLine("Abstand Links: {0} | Abstand Rechts: {1}",this.panel_main_menu.Left,this.panel_main_menu.Right);
    this.panel_main_menu.BackColor = Color.Coral;

    this.panel_main_menu.Controls.Add(this.button_login);
    this.panel_main_menu.Controls.Add(this.button_settings);
    this.panel_main_menu.Controls.Add(this.button_exit);

    this.Controls.Add(this.panel_main_menu);
  }
}

Das hier Screenshot ist das Ergebniss.

Das mit den IDE's is immer so ne Sache,...
für Linux kenn ich nur eine IDE aber die bekomme ich nit zum laufen, is aber auch egal, weil bevorzugt arbeite ich mit vim... :p

Gruß,
BugBott
 
Du rufst dein Init im Konstruktor an. Zu diesem Zeitpunkt ist die Form noch nicht visible und hat entsprechend auch noch nicht die tatsächlichen Werte für die Breite und die Höhe.

Die Init()-Methode solltest du im Form_Load Event aufrufen bzw. musst du auch beim Form_Resize die entsprechende Positionierung vornehmen.
 
Huhu :)

Programmier zwar kein C, aber:

Code:
    this.panel_main_menu.Top = this.Height / 2 - this.panel_main_menu.Top / 2;

Das ist falsch...

Code:
this.panel_main_menu.Top = this.Height / 2 - this.panel_main_menu.Height / 2;

Das wäre das, was du meintest :)
 
cosmochaosmaker hat gesagt.:
Btw würd ich das Panel im Form.SizeChanged Event zentrieren.
Sorry für die Irreführung. Ich meinte natürlich Form.Resize. :-(

Was mir an deinem Code auffällt ist, dass Du gar keine Größenangaben für dein Form festlegst.
Und SoL_Psycho hat Recht.
Code:
public class GCards{

	void GCards(){
		Init();
	}

	void Init(){
		/* Wie gehabt. Lass aber den CentrierungsCode weg.*/
		
		this.Load += new EventHandler(GCards_Load);
		this.Resize += new EventHandler(GCards_Resize);
	}	

	private void GCards_Resize(object sender, EventArgs e) {
		centerMainMenu();
	}

	private void GCards_Load(object sender, EventArgs e) {
		centerMainMenu();
	}
	
	void centerMainMenu(){
		Console.WriteLine("Formbreite: {0} | Formhöhe: {1}",this.Width, this.Height);
		this.panel_main_menu.Left = this.Width / 2 - this.panel_main_menu.Width / 2;
		this.panel_main_menu.Top = this.Height / 2 - this.panel_main_menu.Height / 2;
		Console.WriteLine("Abstand Links: {0} | Abstand Rechts: {1}",this.panel_main_menu.Left,this.panel_main_menu.Right);
	}
}
MfG, cosmo
 
Danke,
ich werd das morgen mal ausprobieren.

Größenangaben für das Formular habe ich bewußt wegfallen lassen da das Formular nur Maximiert sein soll. Was ich noch machen muss ist das das Formular nicht "Normalisiert" werden darf.

Gruß,
BugBott
 
Zurück