2010-04-28 7 views
5

Ich muss das Label Control von Grund auf neu erfinden/neu erstellen, um meine eigene Mojoness hinzuzufügen. Ja, ich weiß, was du denkst (und wenn du das nicht denkst, solltest du nicht sein?).Das Label Control neu erfinden

Kann mir jemand in die richtige Richtung?

Vielen Dank.

Der ganze Zweck für das Etikett neu zu erstellen ist, dass ich über die volle Kontrolle will, wie es auf dem Bildschirm gezeichnet wird, und so, dass ich für sie KeyDown Event-Handler hat, auch. Der Benutzer kann beispielsweise den Inhalt eines Etiketts genau so bearbeiten, wie er den Inhalt eines TextBox-Steuerelements bearbeiten würde.

Auch kann ich nicht einfach nur ein Textboxsteuerelement verwenden, da es fast erfordern würde, wenn nicht mehr Arbeit mein gewünschtes Ergebnis zu erhalten.

+2

Ich bin nicht sicher, ich denke, was Sie dachten, ich dachte ... – Paddy

+1

Was wollen Sie es tun? Abgesehen davon, wie Kyle vorgeschlagen hat, dass Sie die aktuelle erweitern, ist es unmöglich, auf Ihre Frage konstruktiv ohne weitere Informationen zu antworten. – itsmatt

+1

Willst du die Welt erobern Pinky? – Mike

Antwort

1

Erstellen Sie Ihre eigenen Label-Steuerelement ist einfach genug, Sie müssen nur mit Control starten und überschreiben OnPaint(). Was zum Byte geht, ist es, es in ein Steuerelement zu verwandeln, das auch fokussierendes Verhalten hat. Und ermöglicht dem Benutzer, den Text zu bearbeiten. Wenn Sie fertig sind, haben Sie das TextBox-Steuerelement neu erfunden. Das ist viel schwieriger als es aussieht.

Fokus auf dem ersten Schwerpunkt, das ist das schwierigste Problem. Es ist nicht sehr wahrscheinlich, dass der Benutzer die Steuerung häufig fokussieren möchte. Vielleicht eine Art geheimer Händedruck, wie ein Doppelklick. Wenn Sie eine erkennen, können Sie ein TextBox-Steuerelement erstellen und es vor dem Etikett platzieren. Wenn Sie den Fokus verlieren, aktualisieren Sie die Eigenschaft Text des Labels. Oder ein einfaches Kontextmenü, das einen kleinen Bearbeitungsdialog anzeigt.

Ein Beispiel, das Konzept bearbeiten die Doppelklick verwendet:

using System; 
using System.Windows.Forms; 

class MyLabel : Label { 
    private TextBox mEditor; 
    protected override void OnDoubleClick(EventArgs e) { 
    if (mEditor == null) { 
     mEditor = new TextBox(); 
     mEditor.Location = this.Location; 
     mEditor.Width = this.Width; 
     mEditor.Font = this.Font; 
     mEditor.Text = this.Text; 
     mEditor.SelectionLength = this.Text.Length; 
     mEditor.Leave += new EventHandler(mEditor_Leave); 
     this.Parent.Controls.Add(mEditor); 
     this.Parent.Controls.SetChildIndex(mEditor, 0); 
     mEditor.Focus(); 
    } 
    base.OnDoubleClick(e); 
    } 
    void mEditor_Leave(object sender, EventArgs e) { 
    this.Text = mEditor.Text; 
    mEditor.Dispose(); 
    mEditor = null; 
    } 
    protected override void Dispose(bool disposing) { 
    if (disposing && mEditor != null) mEditor.Dispose(); 
    base.Dispose(disposing); 
    } 
} 
+1

Hmmm interessant. .. Wissen Sie zufällig irgendwelche Tutorials/Dokumentation, die mich in die richtige Richtung bringen würden, ein neues Label und/oder TextBox Control zu erstellen? –

+0

@ j-t-s: jedes anständige Windows Forms Buch sollte Ihnen helfen, loszulegen. Ich habe meinen Beitrag mit einem Beispiel-Steuerelement aktualisiert, das die Bearbeitung mit einem Doppelklick ermöglicht. –

5

Warum nicht einfach die aktuelle verlängern?

class MyMojoLabel : Label // Kind of thing

+0

Ich habe dies in meinem aktuellen Projekt getan, hauptsächlich um dynamische Sprachänderungen vorzunehmen und das Flimmern zu reduzieren. – Skizz

+0

Sein ganzer Punkt ist nicht das, was ich verstehe. Klasse MyMojoLabel: UserControl scheint wie ein besserer Start. –

+0

@Bastiaan Linders - Ich denke nicht, dass eine Benutzerkontrolle wäre, worüber die OP sprach. Komplexitätsstufen gehen von 'class MyMojoLabel: Control' zu' class MyMojoLabel: Label' zu 'class MyMojoLabel: UserControl'. Ein Benutzersteuerelement ist im Grunde nur eine Gruppe vorhandener Steuerelemente. – stevehipwell

3

Ein guter Ausgangspunkt wäre vielleicht zu verstehen, wie Microsoft das Etikett umgesetzt.

Um einen besseren Einblick zu erhalten, sollten Sie einen Blick auf Reflector in die Klasse oder debugging the source code der Label-Steuerung werfen.

2
public class MyLabel : System.Windows.Forms.Label 
{ 
    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     // or leave base out 

     // you would determine these values by the length of the text 
     e.Graphics.DrawEllipse(new System.Drawing.Pen(System.Drawing.Color.Red), 
           0, 0, 50, 12); 

    } 

    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 

     // although a label has a KeyDown event I don't know how it would 
     // receive focus, maybe you should create a text box that looks 
     // like a label 
    } 
} 

Wie wäre es damit?

+0

Sieht aus, als hätten wir die gleiche Idee zur gleichen Zeit, +1 für die OnKeyDown-Überschreibung (und für die Verwendung von Rot als Demo-Farbe) – invert

2

Erstellen Sie eine Klasse, die von Control erbt. Verwenden Sie den SetStyle() - Aufruf, um Benutzerbemalung und doppelte Pufferung zu aktivieren, und überschreiben Sie OnPaint() und alle anderen Methoden, die Sie benötigen.

class MyLabel : System.Windows.Forms.Control 
{ 
    public MyLabel() 
    { 
     this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); 
    } 

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     ControlPaint.DrawBorder3D( e.Graphics, this.ClientRectangle, Border3DStyle.Etched, Border3DSide.All); 
     e.Graphics.DrawString(this.Text, this.Font, Brushes.Red, 0, 0); 
    } 
} 
Verwandte Themen