Jag håller på att göra om en control som går ut på att ha en vertikaltext, med två färgers bakgrund. Benni, Johan. Benni, Benni, Jag gjorde så här: Benni, Du har rätt att jag vrider texten 90grader, men jag ville ha det dynamiskt. Benni, Benni, Nej tyvärr, texten försvann alldeles. Benni, Hej Håkan och tusen tack. Benni, Jag pratade med Pelle om att ha en plats enbart för usercontrol, för att kunna dela med sig.Få in texten centrerad i en usercontrol
Mitt problem är att jag inte kan centrera texten.
<code>
float hojd = (this.Height/2 - VertikalText.Length)/2 ;
float bred = (this.Width /2);
Font minFont = new Font("Bauhaus 93",20);
Graphics g = e.Graphics;
g.TranslateTransform(bred -2,hojd -2);
g.RotateTransform(-90.0f);
g.DrawString(VertikalText, minFont, new SolidBrush(textColor1), 0.0f, 0.0f);
g.ResetTransform();
</code>
Det finns två barametrar här som jag har krabbat med hojd och bred.
Om vi börjar med bred, så skall den ju vara på hälften av controllens bred, men det skiter sig pga textens storlek, hur gör jag där?
Hojd är ännu värre.
Som jag har tänkt, så utgår jag ifrån controlens höjd/2 - halva textens längd.
Hur jag än gör så går det åt skogen.
Några tips?
[REDIGERAT]
När det gäller bred så har jag lyckats med att lösa det.
<code>
float bred = (this.Width /2)-(Font.Height/2);
</code>
..nu gäller det bara höjden...Sv: Få in texten centrerad i en usercontrol
Du har TextAlign denn kan du ändra så den blir centrerad, kanske kan vara en liten hjälp på vägen?
Lite svårt att förstå exakt vad du vill. Men TextAlign gör att texten hamnar där du vill ha den i textrutan.
Mvh JohanSv:Få in texten centrerad i en usercontrol
Nej jag skriver ju ut texten direkt på kontrollen
<code>
(private void v_Text_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
</code>
..och där kan jag inte hitta de egenskaperna.
Min ide är så här. Denna kontrollen skall jag ha till vänster, och går uppifrån och ner med en bred av ca 20 px. Texten som skrivs in blir(redan klart) vertikalt.
Om jag utgår ifrån 0 så börjar texten högst upp och skriver utanför formuläret.
Om jag utgår ifrån this.Height, så skrivs texten ut med början ifrån det nedersta vänstra hörnet på kontrollen.
Rimligen så borde jag hitta mitten med
<code>
float hojd =(this.Height/2) + (VertikalText.Length/2);
</code>
Detta borde ju rimmligen göra så att texten blir på mitten, men nix.
Jag börjar nu också misstänka att jag labborera med två måttenheter, jag tror inte att kontrollens mått är i px men jag misstänker att texten(VertikalText.Length) blir det.Sv: Få in texten centrerad i en usercontrol
Innan du roterar texten så räknar du ut dimensionern apå den med <b>MeasureString</b>-metoden som finns på ditt <b>Graphics</b>-objekt. Metoden returnerar en <b>SizeF</b> variabel som innehåller bredden och höjden på texten när den skrivs ut med den angivna fonten. Vad du nu tar är <b>Höjden</b> på den texten och använder den i dina beräkningar eftersom denna blir din bredd när du väl roterat strängen.
Hoppas det löser sig!Sv: Få in texten centrerad i en usercontrol
... Såg att Andreas redan hunnit före... ;-)
Mvh JohanSv:Få in texten centrerad i en usercontrol
<code>
MessageBox.Show(g.MeasureString(VertikalText,minFont).ToString());
</code>
... och får mycket riktigt ut
{width=403,6805,height-33,51562}
men jag förstår inte hur jag skall hantera dessa tal.Sv: Få in texten centrerad i en usercontrol
Om du rundar uppåt till närmaste heltal så kan du använda dessa till att veta höjden resp. bredden på den vertikala texten. Det var väl det som du vill? För om du roterar 90grader så blir juh Höjd->Bredd och Bredd->Höjd, eller har jag missförstått dig totalt? =) Jag utgår i från (baserat på din kod) att du vrider texten och <b>inte</b> skriver ut den vertikalt så som
A
N
D
R
E
A
S
Utan som ANDREAS och sen roterar du hela den 90 grade moturs?Sv:Få in texten centrerad i en usercontrol
Dvs har jag ett formulär som är 200 högt så ville jag börja på 100. *Skriver jag då in fyra bokstäver så
skulle den börja på 98.
Är du med på hur jag menar.
Dit förslag på MeasureString låter ju intressant, men jag förstår inte hur jag skall hantera siffrorna där (eller ta ut dem).
<code>
Font minFont = new Font("Bauhaus 93",20);
Graphics g = e.Graphics;
g.MeasureString(VertikalText,minFont)
</code>
Så här långt är jag med men sen så...
(nu har jag hållit dig sysselsatt bra länge Andreas...)Sv: Få in texten centrerad i en usercontrol
Så problemet är att när du har roterat din text så vill du skriva ut den <b>centrerat</b>, både vertikalt och hotizontalt, på kontrollens yta? Har jag uppfattat dig korrekt nu då? =)Sv: Få in texten centrerad i en usercontrol
Prova något i stil med (Obs! Helt otestad kod, skriven för hand så det kan finnas fel)
SizeF textStorlek = g.MeasureString(VertikalText,minFont)
float offsetX = ((this.Width / 2) - (Math.Ceiling(textStorlek.Height)));
float offsetY = ((this.Height / 2) - (Math.Ceiling(textStorlek.Width)));
g.DrawString(VertikalText, minFont, new SolidBrush(textColor1), (float)offsetX, (float)offsetY);
<b>Math.Ceiling</b> används för att runda upp till närmaste heltal.
Sv:Få in texten centrerad i en usercontrol
Jag fick ändra lite:
<code>
SizeF textStorlek = g.MeasureString(VertikalText,minFont);
float offsetX = Convert.ToInt64(((this.Width / 2) - (Math.Ceiling(textStorlek.Height))));
float offsetY = Convert.ToInt64(((this.Height / 2) - (Math.Ceiling(textStorlek.Width))));
</code>
..men det kan ju inte vara det som ställer till det.Sv: Få in texten centrerad i en usercontrol
Nu är jag hemma från jobb så nedan finner du ett fullt fungerande exempel på en kontroll som ritar roterad text centrerat i en usercontrol. Mycket nöje.
using System;
using System.Collections;
using System.Diagnostics;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace ControlExample
{
public class TextControl : System.Windows.Forms.UserControl
{
private string verticalText = "Andreas";
private System.ComponentModel.Container components = null;
public TextControl()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
[Browsable(true)]
public string VerticalText
{
get { return this.verticalText; }
set
{
this.verticalText = value;
this.Invalidate();
}
}
#region Component Designer generated code
private void InitializeComponent()
{
this.Name = "TextControl";
this.Resize += new System.EventHandler(this.TextControl_Resize);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.TextControl_Paint);
}
#endregion
private void TextControl_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if( this.VerticalText != String.Empty )
{
Graphics g = e.Graphics;
SizeF textStorlek = g.MeasureString(this.VerticalText,this.Font);
float offsetX = (float)((this.Width / 2) - (Math.Ceiling(textStorlek.Height) / 2));
float offsetY = (float)((this.Height / 2) + (Math.Ceiling(textStorlek.Width) / 2));
g.TranslateTransform(offsetX,offsetY);
g.RotateTransform(-90.0f);
g.DrawString(this.VerticalText, this.Font, new SolidBrush(this.ForeColor), 0, 0);
g.ResetTransform();
}
}
private void TextControl_Resize(object sender, System.EventArgs e)
{
this.Invalidate();
}
}
}
Sv:Få in texten centrerad i en usercontrol
Nu när jag har fått pular lite granna, så har jag fått det helt pefekt.
En stilla undran, varför behöll du mina variabler(hojd,bred) när du inte använde dem?Sv: Få in texten centrerad i en usercontrol
Jag tog helt enkelt inte bort det - glömde. Har uppdaterat mitt exempel nu =)Sv:Få in texten centrerad i en usercontrol
Vad tror du om det?