2016-12-18 13 views
1

Ich habe eine Zeichenfolge mit Text und ich möchte es auf die spezifische Zeichenposition zentriert ausgeben.Wie zentriert man Text auf bestimmte Zeichenpositionen?

Gibt es eine Möglichkeit, zum Beispiel mit Label?

Oder sollte ich besser in Erwägung ziehen, eine Zeichenkette mit GDI + zu zeichnen, die jede Zeichenlänge misst und sie dann manuell an die Stelle zieht, wo ich sie brauche, zentriert?

Beispiel, werden deutlicher:

String: "Lorem Ipsum", Position: 2.

Daraus muss ich die in einer solchen Art und Weise angezeigt Zeichenfolge, die Zeichen "r" in der Mitte sein wird von welcher Display-Box (Etikett, etc.).

+0

Sie können GDI + (typografisch) kombinieren, um beide Teile zu messen, um relative Breiten zu finden. Dann positionieren Sie das Label entsprechend. – TaW

+0

@TaW, Ja, ich dachte darüber nach, als ich GDI + erwähnte, aber ich bin nicht gut mit GDI + und fragte mich, ob es eine einfachere Lösung gibt. – Murumuru

+0

Wenn Sie eine willkürliche Ausrichtung wünschen, gibt es keine einfachere Lösung als das manuelle Zeichnen. Das erfordert natürlich, dass Sie es auch messen. Wenn es sich um ein Steuerelement namens "Label" handelt, wird es tatsächlich mit GDI und nicht mit GDI + gezeichnet, und Sie sollten dabei bleiben. 'TextRenderer.DrawText' für die Ausgabe,' TextRenderer.MeasureText' auf, naja, messen. –

Antwort

2

Hier ist eine Positionierungsfunktion, die helfen soll:

void positionTo(Label lbl, Panel pan, int pos) 
{ 
    SizeF sz0, sz1, sz2; 
    sz0 = sz1 = sz2 = Size.Empty; 
    using (Graphics g = lbl.CreateGraphics()) 
    { 
     StringFormat sf = StringFormat.GenericTypographic; 
     sz0 = g.MeasureString(lbl.Text, lbl.Font, pan.Width, sf); 
     sz1 = g.MeasureString(lbl.Text.Substring(0, pos), lbl.Font, pan.Width, sf); 
     sz2 = g.MeasureString(lbl.Text.Substring(pos), lbl.Font, pan.Width, sf); 
    } 
    lbl.Left = (int)(pan.Width/2 - sz1.Width); 
} 

enter image description here

Bitte beachte, dass ich nur die linke Teil Messung verwenden. Man könnte beide verwenden, um die Zentrierung zu verfeinern.

+0

Danke, jetzt verstehe ich es. – Murumuru

+0

@TaW können Sie einen Link für dieses einfache Beispiel geben? – chopperfield

+0

Was meinst du ?? Dies ist der 'numericUpDown1_ValueChanged'-Ereigniscode: 'positionTo (label2, panel1, (int) numericUpDown1.Value);' – TaW

Verwandte Themen