Pregunta

El código siguiente muestra un problema muy simple; Estoy esperando que me acaba perdiendo un entorno que alguien podría ser capaz de revelar.

Goal

(1) Lanzamiento WinForm principal (MainForm).
(2) Pulse el botón para visualizar WinForm secundaria (Sombras) que es semi-transparente y debe MainForm exactamente superposición.

lo que realmente sucede

Escenario 1 : Lanzamiento WinForm principal luego presione el botón: Sombras pantallas con tamaño correcto, pero la ubicación incorrecta, inferior y hacia la derecha (como si estuviera en cascada). Pulse el botón para cerrar Sombras de nuevo. Pulse el botón una vez más para volver a abrir las Sombras y ahora está en la posición correcta, cubriendo MainForm.

Escenario 2 : Lanzamiento WinForm principal, moverlo, a continuación, pulse el botón: Sombras pantallas con tamaño correcto, pero la ubicación incorrecta (donde el MainForm era antes de moverlo). Pulse el botón para cerrar; pulse de nuevo para volver a abrir y ahora Sombras está en la posición correcta.

using System;
using System.Windows.Forms;

namespace LocationTest
{
    static class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }

    public class MainForm : Form
    {
        ShadowForm shadowForm = new ShadowForm();
        Button button1 = new Button();
        System.ComponentModel.IContainer components = null;

        public MainForm()
        {
            this.SuspendLayout();
            this.button1.Location = new System.Drawing.Point(102, 44);
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.button1);
            this.ResumeLayout(false);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (shadowForm.Visible) { shadowForm.Hide(); }
            else
            {
                shadowForm.Size = Size; // this always works
                shadowForm.Location = Location; // this fails first time, but works second time!
                shadowForm.Show();
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null)) { components.Dispose(); }
            base.Dispose(disposing);
        }
    }

    public class ShadowForm : Form
    {
        private System.ComponentModel.IContainer components = null;

        public ShadowForm()
        {
            this.SuspendLayout();
            this.BackColor = System.Drawing.Color.Black;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Opacity = 0.5;
            this.Click += new System.EventHandler(this.ShadowForm_Click);
            this.ResumeLayout(false);
        }

        private void ShadowForm_Click(object sender, EventArgs e)
        {
            Hide();
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null)) { components.Dispose(); }
            base.Dispose(disposing);
        }
    }
}
¿Fue útil?

Solución

Se debe ajustar el StartPosition el manual antes de establecer su posición de primera vez.

shadowForm.StartPosition = FormStartPosition.Manual;
shadowForm.Size = Size; // this always works
shadowForm.Location = Location; // this fails first time, but works second time!
shadowForm.Show();

o como sugirió Joel:

shadowForm.StartPosition = FormStartPosition.CenterParent;  // Location shouldn't need to be set
shadowForm.Size = Size; // this always works
shadowForm.Show();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top