Mostrar un formulario secundario en el centro de la forma principal en C #

Creé un nuevo formulario y llamé desde el formulario principal de la siguiente manera:

loginForm = new SubLogin(); loginForm.Show(); 

Necesito mostrar el formulario secundario en el centro del padre. Entonces, en la carga de la forma del niño, hago lo siguiente: `

 Point p = new Point(this.ParentForm.Width / 2 - this.Width / 2, this.ParentForm.Height / 2 - this.Height / 2); this.Location = p; 

Pero esto es un error de ejecución ya que el formulario principal es nulo. Traté de establecer la propiedad Parent también, pero no ayudé. ¿Alguna entrada en esto?

Tratar:

 loginForm.StartPosition = FormStartPosition.CenterParent; loginForm.ShowDialog(this); 

Por supuesto, el elemento secundario ahora será un formulario de locking (cuadro de diálogo) de la ventana primaria, si no se desea, simplemente reemplace ShowDialog con Show

 loginForm.Show(this); 

Sin embargo, aún deberá especificar StartPosition.

Parece haber una confusión entre “Padre” y “Propietario”. Si abre un formulario como formulario MDI, es decir, incrustado dentro de otro formulario, esta forma circundante es el Padre. La propiedad de formulario StartPosition con el valor FormStartPosition.CenterParent hace referencia a esta. El parámetro que puede pasar al método Show es el Propietario, ¡no el Padre! Esta es la razón por la cual frm.StartPosition = FormStartPosition.CenterParent no funciona como puede esperar.

El siguiente código colocado en un formulario lo centrará con respecto a su propietario con algún desplazamiento, si su Posición de inicio se establece en Manual. El pequeño desplazamiento abre los formularios en mosaico. Esta es una ventaja si el propietario y el formulario propiedad tienen el mismo tamaño o si abre varios formularios propios.

 protected override void OnShown(EventArgs e) { base.OnShown(e); if (Owner != null && StartPosition == FormStartPosition.Manual) { int offset = Owner.OwnedForms.Length * 38; // approx. 10mm Point p = new Point(Owner.Left + Owner.Width / 2 - Width / 2 + offset, Owner.Top + Owner.Height / 2 - Height / 2 + offset); this.Location = p; } } 

Suponiendo que su código se ejecuta dentro de su formulario principal, entonces algo como esto es probablemente lo que está buscando:

 loginForm = new SubLogin(); loginForm.StartPosition = FormStartPosition.CenterParent loginForm.Show(this); 

Para el registro, también hay una función Form.CenterToParent() , si necesita centrarla después de la creación por cualquier razón también.

Al iniciar un formulario dentro de un formulario .CenterScreen deberá usar .CenterScreen lugar de .CenterParent .

 FrmLogin f = new FrmLogin(); f.MdiParent = this; f.StartPosition = FormStartPosition.CenterScreen; f.Show(); 

La configuración de parent no funciona para mí a menos que use form.ShowDialog(); .

Al usar form.Show(); o form.Show(this); nada funcionó hasta que use, this.CenterToParent(); . Acabo de poner eso en el método Load del formulario. Todo es bueno.

La posición de inicio en el centro del elemento primario se configuró y funciona cuando se usa el diálogo de locking showdialog.

Necesitas esto:

Reemplazame con this.parent, pero debes establecer el elemento principal antes de mostrar ese formulario.

  Private Sub ÜberToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÜberToolStripMenuItem.Click 'About.StartPosition = FormStartPosition.Manual ' !!!!! About.Location = New Point(Me.Location.X + Me.Width / 2 - About.Width / 2, Me.Location.Y + Me.Height / 2 - About.Height / 2) About.Show() End Sub 
 childform = new Child(); childform.Show(this); 

En caso de carga de Childform

 this.CenterToParent(); 

En el Formulario SubLogin exponería un método SetLocation para que pueda configurarlo desde su formulario principal:

 public class SubLogin : Form { public void SetLocation(Point p) { this.Location = p; } } 

Luego, desde su formulario principal:

 loginForm = new SubLogin(); Point p = //do math to get point loginForm.SetLocation(p); loginForm.Show(); 

Funciona en todos los casos, intercambie Form1 para su formulario principal.

 Popup popup = new Popup(); popup.StartPosition = System.Windows.Forms.FormStartPosition.Manual; popup.Location = new System.Drawing.Point((Form1.ActiveForm.Location.X + Form1.ActiveForm.Width / 2) - (popup.Width / 2),(Form1.ActiveForm.Location.Y + Form1.ActiveForm.Height / 2) - (popup.Height / 2)); popup.Show(Form1.ActiveForm); 

El padre probablemente aún no está configurado cuando intenta acceder a él.

Prueba esto:

 loginForm = new SubLogin(); loginForm.Show(this); loginForm.CenterToParent() 

Haga un formulario de Windows, luego ponga la opción para él: CenterParent luego use este código:

 yourChildFormName x = new yourChildFormName(); x.ShowDialog(); 

Si tiene que centrar su childForm, desde childForm, el código será algo así. Este código está en childForm.cs

 this.Show(parent as Form); // I received the parent object as Object type this.CenterToParent(); 

Si desea calcular su propia ubicación, primero configure FormStartPosition.Manual en FormStartPosition.Manual :

 Form Child = new Form(); Child.StartPosition = FormStartPosition.Manual; Child.Location = new Point(Location.X + (Width - Child.Width) / 2, Location.Y + (Height - Child.Height) / 2); Child.Show(this); 

Donde esta es la forma principal / principal, al igual que Location.X.

El valor predeterminado para FormStartPosition.CenterParent es FormStartPosition.CenterParent y, por lo tanto, cambia la ubicación del niño después de mostrarlo.

Puede establecer StartPosition en el constructor del formulario secundario para que todas las instancias nuevas del formulario se centren en su elemento principal:

 public MyForm() { InitializeComponent(); this.StartPosition = FormStartPosition.CenterParent; } 

Por supuesto, también puede establecer la propiedad StartPosition en las propiedades del Diseñador para su formulario secundario. Cuando desee mostrar el formulario secundario como diálogo modal, simplemente configure el propietario de la ventana en el parámetro para el método ShowDialog:

 private void buttonShowMyForm_Click(object sender, EventArgs e) { MyForm form = new MyForm(); form.ShowDialog(this); } 

¿Por qué no usar esto?

 LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)