Frage

Der folgende Code zeigt ein sehr einfaches Problem; Ich hoffe, dass ich nur eine Einstellung fehle, dass jemand könnte in der Lage sein zu zeigen.

Ziel

(1) Starten Haupt winform (Mainform).
(2) Drücken Sie die Taste Sekundär winform (Schatten) anzuzeigen, ist halbtransparent und sollte genau Overlay Mainform.

Was passiert eigentlich

Szenario 1 : Starten Haupt winform dann drücken Sie die Taste: Schatten Displays mit dem richtigen Größe, aber falscher Lage, niedriger und nach rechts (als ob es kaskadiert). Drücken Sie die Taste erneut Schatten zu schließen. Drücken Sie die Taste erneut, um Schatten wieder öffnen und jetzt ist es in der richtigen Position und deckt Mainform.

Szenario 2 : Haupt winform starten, es bewegt, dann drücken Sie die Taste: Schatten Displays mit dem richtigen Größe, aber falscher Stelle (wo die Mainform, bevor es war). Drücken Sie die Taste zu schließen; Drücken Sie erneut wieder zu öffnen und jetzt Schatten ist in der richtigen Position.

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);
        }
    }
}
War es hilfreich?

Lösung

Sie sollten setzen die Startposition zu Handbuch, bevor Sie Ihren Standort das erste Mal zu setzen.

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

oder als Joel vorgeschlagen:

shadowForm.StartPosition = FormStartPosition.CenterParent;  // Location shouldn't need to be set
shadowForm.Size = Size; // this always works
shadowForm.Show();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top