14. november 2005 - 11:42Der 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
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.
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;
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.
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.
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; }
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.
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.
Synes godt om
Ny brugerNybegynder
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.