Feedback

C# - Fixes Form in Höhe und Breite verdoppeln, Inhalt skalieren

Veröffentlicht von am 5/19/2010
(0 Bewertungen)
Ein einfaches Form, wo alles feste Größe hat, soll in der Höhe und Breite doppelt so groß werden. (bei mir, wenn Höhe des Bildschirms einen Wert 640 überschreitet.)

Anchor steht bei mir immer auf links-oben.

Schriftgrößen und Controlinhalte sollen mit wachsen.

Nicht perfekt. Radiobuttons und Checkboxen wachsen leider nicht komplett mit. Funktioniert sonst aber bei mir wie gewünscht.
        public int FormScaleFactor = 1;


        /// <summary>
        /// Form ggf. skalieren, wenn Bildschirmhöhe größer 640
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form_Shown(object sender, EventArgs e)
        {

            if (this.DesignMode) return;

            int intY = Screen.PrimaryScreen.Bounds.Height;
            if (intY >= 640)
            {
                FormScaleFactor = 2;

                this.SuspendLayout();

                //Font skalieren
                float currentSize = this.Font.SizeInPoints;
                currentSize = currentSize * FormScaleFactor;
                this.Font = new Font(this.Font.Name, currentSize,
                    this.Font.Style);

                //Form vergrößern
                this.Size = new Size(
                                this.Width * FormScaleFactor, 
                                this.Height * FormScaleFactor);

                //Controls des Forms skalieren
                foreach (Control ctrl in this.Controls)
                    ReSizeByFactor(ctrl);

                this.ResumeLayout();

            }
        }

        /// <summary>
        /// Skaliert ein Control und ruft rekursiv die Childcontrols auf
        /// </summary>
        /// <param name="ctrl">Control</param>
        /// <remarks>Faktor in FormScaleFactor</remarks>
        public void ReSizeByFactor(Control ctrl)
        {

            if (FormScaleFactor == 1) return;            

            DockStyle olddock = ctrl.Dock;
            AnchorStyles oldanchor = ctrl.Anchor;
            Point oldLocation = new Point(ctrl.Left, ctrl.Top);
           
            ctrl.Dock = DockStyle.None;
            ctrl.Anchor = AnchorStyles.None;

            ctrl.Size = new Size(
                ctrl.Width * FormScaleFactor, 
                ctrl.Height * FormScaleFactor);
            ctrl.Location = new Point(
                oldLocation.X * FormScaleFactor, 
                oldLocation.Y * FormScaleFactor);

            if (ctrl.Font != ctrl.Parent.Font)
            {
                //Font vergrößern, wenn Control eine eigene Schrift hat
                float currentSize = ctrl.Font.SizeInPoints;
                currentSize = currentSize * FormScaleFactor;
                ctrl.Font = new Font(ctrl.Font.Name, currentSize,
                    ctrl.Font.Style);
            }

            //bestimmte Control-Klassen noch gesondert behandeln
            if (ctrl is Button)
            {
                //Bild vergrößern 
                //Die Methode ResziePicByWitdh in anderem Snippet suchen!
                Button btn = ctrl as Button;
                if (btn.Image != null)
                    btn.Image = ResizePicByWidth(
                        btn.Image, btn.Image.Width * FormScaleFactor);
                if (btn.BackgroundImage != null)
                    btn.BackgroundImage = ResizePicByWidth(
                        btn.BackgroundImage, btn.BackgroundImage.Width * FormScaleFactor);
            }
            else if (ctrl is ListView)
            {
                ListView lst = ctrl as ListView;
                foreach (ColumnHeader clh in lst.Columns)
                {
                    clh.Width = clh.Width * FormScaleFactor;
                }
            }
            //else if (ctrl is ...)

            ctrl.Dock = olddock;
            ctrl.Anchor = oldanchor;

            //Rekursiv die enthaltenen Controls weiter skalieren
            foreach (Control ctrlchild in ctrl.Controls)
                ReSizeByFactor(ctrlchild);

        }
Abgelegt unter Form, Size, Skalieren.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!