Avatar billede anadan Nybegynder
14. november 2005 - 11:42 Der er 15 kommentarer og
2 løsninger

Finde højde af Control (knap, e.l.)

Jeg skal tilføje nogle knapper til en parent kontrol, men teksten kan ændres, hvorfor jeg har brug for sætte højden af kontrollen så det passer med teksten. Der skal også tages højde for at der kan være billede på knappen
Avatar billede bitsch Nybegynder
14. november 2005 - 14:35 #1
Tilfredsstiller AutoSize = true dit behov?
Avatar billede anadan Nybegynder
14. november 2005 - 15:11 #2
AutoSize har så vidt jeg ved betydning vertikalt, ikke horisontalt
Avatar billede bitsch Nybegynder
15. november 2005 - 08:35 #3
Du tager fejl!
Autosize tilpasser knappen til labelen både i højden og bredden.
Avatar billede anadan Nybegynder
16. november 2005 - 14:30 #4
kan du give et eksempel på hvor den tilpasses automatisk med en button?
Avatar billede bitsch Nybegynder
17. november 2005 - 09:10 #5
Eksempel:
På din Button sætter du AutoSize til true.
Så sætter du din tekst, og vupti, Button scalerer sig til teksten.

Du kan naturligvis sætte MaximumWidth hvis du har en max bredde.


Nb! Nu kender jeg ikke dit scenarie, men et design med knapper som scalerer sig dynamisk er ikke altid det mest hensigtsmæssige (Ved mindre der er tale om Lokalicering/Globalicering). Overvej eventuelt en standard størrelse og sæt derefter AutoEllipsis til true.
Avatar billede bitsch Nybegynder
17. november 2005 - 09:49 #6
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public class Form1 : Form
    {
        private System.ComponentModel.IContainer components = null;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Button buttonSetText;

        public Form1()
        {
            InitializeComponent();

            this.ButtonSetTextClick(this, EventArgs.Empty);
        }

        private void ButtonSetTextClick(object sender, EventArgs e)
        {
            this.button1.Text = this.textBox1.Text;
            this.button2.Text = this.textBox1.Text;
        }

        private void InitializeComponent()
        {
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.buttonSetText = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            //
            // groupBox1
            //
            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.groupBox1.Controls.Add(this.button2);
            this.groupBox1.Controls.Add(this.button1);
            this.groupBox1.Location = new System.Drawing.Point(13, 13);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(267, 181);
            this.groupBox1.TabIndex = 0;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "Demo";
            //
            // button1
            //
            this.button1.AutoSize = true;
            this.button1.Location = new System.Drawing.Point(7, 20);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            //
            // button2
            //
            this.button2.AutoSize = true;
            this.button2.Location = new System.Drawing.Point(7, 80);
            this.button2.MaximumSize = new System.Drawing.Size(100, 0);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 1;
            this.button2.Text = "button2";
            //
            // textBox1
            //
            this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox1.Location = new System.Drawing.Point(13, 200);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(267, 20);
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "Text";
            //
            // buttonSetText
            //
            this.buttonSetText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.buttonSetText.Location = new System.Drawing.Point(205, 226);
            this.buttonSetText.Name = "buttonSetText";
            this.buttonSetText.Size = new System.Drawing.Size(75, 23);
            this.buttonSetText.TabIndex = 2;
            this.buttonSetText.Text = "Set Text";
            this.buttonSetText.Click += new System.EventHandler(this.ButtonSetTextClick);
            //
            // Form1
            //
            this.AcceptButton = this.buttonSetText;
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 261);
            this.Controls.Add(this.buttonSetText);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.groupBox1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.Name = "Form1";
            this.Text = "Form1";
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
Avatar billede anadan Nybegynder
17. november 2005 - 17:28 #7
Takker, jeg kigger lige på det i morgen, fredag.
Avatar billede anadan Nybegynder
18. november 2005 - 10:41 #8
Jeg kan da ikke se hvordan button2 ændrer højde vertikalt.. hvis jeg udskriver PreferredSize, er denne da også konstant højde uanset mængden af text..
Avatar billede bitsch Nybegynder
18. november 2005 - 12:58 #9
Den skalerer sig i henhold til fonten. Desværre understøtter mit ét minutters eksempel ikke dette scenarie.
Avatar billede anadan Nybegynder
18. november 2005 - 14:10 #10
den forstod jeg ikke helt..

den skal skalere sig i højden efterhånden som der kommer mere tekst ind
Avatar billede bitsch Nybegynder
18. november 2005 - 14:39 #11
Du mener hvis teksten wrappes. I såfald gør knapper det ikke de scaleres kun i forhold til fonten, og tilstræber at tilpasse sig i bredden.  Hvis der er sat en Maximum bredde begynder knappen ikke at vokse i forhold til den wrappede tekst. Tåbeligt, men sådan er det (Så vidt jeg ved).

Så hvis du virkeligt ønsker wrappet tekst på knappen, så må du lave en egentlig measure på strengen. Det gør du ved hjælp af DrawText efterfulgt af MeasureString.
Derved får du de fysiske mål på strengen som du kan anvende til at scalere dit kontrol.

Men husk hvad jeg har nævnt før, at set for et brugerperspektiv er det ikke tilrådeligt at ændre teksten og størrelse på en knap i henhold til context i applikationen.
Avatar billede anadan Nybegynder
18. november 2005 - 21:01 #12
Jeg vil understøtte at min parent kontrol kan ændre størrelse, uden at teksten på knappen forsvinder, altså at den vil blive smallere, og højere for at kunne rumme teksten.

Desuden skal kontrollen kunne understøtte forskellige sprog, og dermed forskellig tekst.

Jeg er rimelig sikker på at Label kan løse problemet vertikalt, men jeg skal også have et billede til venstre for teksten, hvilket ikke understøttes af Label (billedet kommer bagved teksten), kun af Button, der som du siger ikke kan wrappe.
Avatar billede bitsch Nybegynder
18. november 2005 - 21:44 #13
Ok du får lige et hurtigt eksempel mere...

namespace WindowsApplication1
{
    using System;
    using System.Drawing;
    using System.Windows.Forms;

    public class Form1 : Form
    {
        /// <summary>
        /// Please note! This is a Quick and Dirty example!
        /// </summary>

        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Button buttonSetText;
        private System.Windows.Forms.TextBox textBox;
        private System.Windows.Forms.TextBox textBoxHeight;
        private System.Windows.Forms.Label label2;
        private System.ComponentModel.IContainer components = null;
        private const int MaximumWidth = 100; // Some maximum width to force wrapping.
        private const int ButtonFramePart = 10;
        private Button button; // Height of button without the text region. (This is only for the demo)
        private Size buttonSize;

        public Form1()
        {
            InitializeComponent();

            this.button.AutoSize = false; // AutoSize must be false in order to be able to set the height!
            this.buttonSize = this.button.Size;
        }

        private void buttonSetText_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.textBox.Text;
            Size size = new Size(Math.Min(this.buttonSize.Width, MaximumWidth) + ButtonFramePart, this.buttonSize.Height + ButtonFramePart);

            this.button.Text = this.textBox.Text;
            this.button.Size = size;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics graphics = e.Graphics;

            this.GetTextHeight(e);
        }

        private void GetTextHeight(PaintEventArgs e)
        {
            Size proposedSize = new Size(MaximumWidth, 0);

            TextFormatFlags textFormatFlags = TextFormatFlags.Left | TextFormatFlags.WordBreak;

            this.buttonSize = System.Windows.Forms.TextRenderer.MeasureText(this.textBox.Text, this.Font, proposedSize, textFormatFlags);

            this.textBoxHeight.Text = this.buttonSize.Height.ToString();
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.buttonSetText = new System.Windows.Forms.Button();
            this.textBox = new System.Windows.Forms.TextBox();
            this.textBoxHeight = new System.Windows.Forms.TextBox();
            this.label2 = new System.Windows.Forms.Label();
            this.button = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // label1
            //
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(9, 9);
            this.label1.MaximumSize = new System.Drawing.Size(100, 0);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(91, 13);
            this.label1.TabIndex = 0;
            this.label1.Text = "Click on Set Text!";
            //
            // buttonSetText
            //
            this.buttonSetText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.buttonSetText.Location = new System.Drawing.Point(205, 231);
            this.buttonSetText.Name = "buttonSetText";
            this.buttonSetText.Size = new System.Drawing.Size(75, 23);
            this.buttonSetText.TabIndex = 1;
            this.buttonSetText.Text = "Set Text";
            this.buttonSetText.UseVisualStyleBackColor = true;
            this.buttonSetText.Click += new System.EventHandler(this.buttonSetText_Click);
            //
            // textBox
            //
            this.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox.Location = new System.Drawing.Point(12, 234);
            this.textBox.Name = "textBox";
            this.textBox.Size = new System.Drawing.Size(186, 20);
            this.textBox.TabIndex = 2;
            this.textBox.Text = "Text to be set then the button is clicked.";
            //
            // textBoxHeight
            //
            this.textBoxHeight.Location = new System.Drawing.Point(12, 208);
            this.textBoxHeight.Name = "textBoxHeight";
            this.textBoxHeight.ReadOnly = true;
            this.textBoxHeight.Size = new System.Drawing.Size(52, 20);
            this.textBoxHeight.TabIndex = 3;
            //
            // label2
            //
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(9, 192);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(41, 13);
            this.label2.TabIndex = 4;
            this.label2.Text = "Height:";
            //
            // button
            //
            this.button.Location = new System.Drawing.Point(12, 92);
            this.button.Name = "button";
            this.button.Size = new System.Drawing.Size(75, 23);
            this.button.TabIndex = 6;
            this.button.Text = "button";
            this.button.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
            this.button.UseVisualStyleBackColor = true;
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.button);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.textBoxHeight);
            this.Controls.Add(this.textBox);
            this.Controls.Add(this.buttonSetText);
            this.Controls.Add(this.label1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

    }
}
Avatar billede bitsch Nybegynder
18. november 2005 - 21:46 #14
Button kan godt wrappe men kun når AutoSize er false. ovenstående eksempel skalerer knappen i højden og bredden, og har desuden en hardcoded max bredde! Det er godtnok noget slamkode jeg lige har griflet ned, men jeg regner med at eksemplet er nok til at du kan komme videre.
Avatar billede bitsch Nybegynder
18. november 2005 - 21:48 #15
I øvrigt anvendeer jeg i dette eksempel TextRenderer klasserne til at lave mesasure på strengen.
Avatar billede anadan Nybegynder
18. november 2005 - 22:30 #16
arh, sweet. det er total godt. Takker :D
Avatar billede bitsch Nybegynder
19. november 2005 - 09:10 #17
Nb, når du anvender TextRenderer klasserne behøver du ikke dit grafiske object. At koden her ligger i OnPaint er blot et lævn fra et tidligere eksempel.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester