2016-09-09 3 views
2

Ich versuche ein maskiertes Textfeld zu erstellen, um eine Rahmenfarbe zu haben.Wie zeichne Rand für MaskedTextBox mit benutzerdefinierten Farbe?

ich diesen Code unten versucht, es zu erreichen:

public class MaskedTextBoxWithBorder : UserControl 
{ 
    MaskedTextBox maskedtextBox; 

    public MaskedTextBoxWithBorder() 
    { 
     maskedtextBox = new MaskedTextBox() 
     { 
      BorderStyle = BorderStyle.FixedSingle, 
      Location = new Point(-1, -1), 
      Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right 
     }; 
     Control container = new ContainerControl() 
     { 
      Dock = DockStyle.Fill, 
      Padding = new Padding(-1) 
     }; 
     container.Controls.Add(maskedtextBox); 
     this.Controls.Add(container); 

     DefaultBorderColor = SystemColors.ControlDark; 
     FocusedBorderColor = Color.Red; 
     BackColor = DefaultBorderColor; 
     Padding = new Padding(1); 
     Size = maskedtextBox.Size; 
    } 

    public Color DefaultBorderColor { get; set; } 
    public Color FocusedBorderColor { get; set; } 

    public override string Text 
    { 
     get 
     { 
      return maskedtextBox.Text; 
     } 
     set 
     { 
      maskedtextBox.Text = value; 
     } 
    } 

    protected override void OnEnter(EventArgs e) 
    { 
     BackColor = FocusedBorderColor; 
     base.OnEnter(e); 
    } 

    protected override void OnLeave(EventArgs e) 
    { 
     BackColor = DefaultBorderColor; 
     base.OnLeave(e); 
    } 

    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) 
    { 
     base.SetBoundsCore(x, y, width, maskedtextBox.PreferredHeight, specified); 
    } 
} 

Aber das Problem ist es nicht, die alle Funktionen des maskierten Textfeld hat wie Maskentyp Einstellung usw.

Also änderte ich meine Code wie folgt:

Jetzt habe ich alle Funktionen der maskierten Textbox, aber Randfarben sind nicht betroffen.

Gibt es eine Möglichkeit, Maskierte Textbox zu erweitern, um Rahmenstil zu erhalten, ohne Features zu verlieren, so etwas, was nicht möglich ist.

public class MaskedTextBoxWithBorder : UserControl, MaskedTestBox 
+0

Sie müssen nicht, dass die Container-Steuerelement. Das UserControl ist bereits ein Container-Steuerelement. – LarsTech

Antwort

2

Zur Grenze von MaskedTextBox ziehen Sie WndProc außer Kraft setzen sollte und WM_NCPAINT Nachricht verarbeiten. Holen Sie dann das Fenster DC des Steuerelements und erstellen Sie ein Graphics Objekt aus diesem DC, dann zeichnen Sie Grenze für die Steuerung. Diese Lösung wurde auch in ToolStripTextBox verwendet. Die Lösung kann auch auf eine TextBox angewendet werden. Änderungen

using System; 
using System.Drawing; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
public class MyMaskedTextBox : MaskedTextBox 
{ 
    public const int WM_NCPAINT = 0x85; 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetWindowDC(IntPtr hWnd); 
    [DllImport("user32.dll")] 
    public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); 
    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == WM_NCPAINT) 
     { 
      var hdc = GetWindowDC(this.Handle); 
      using (var g = Graphics.FromHdcInternal(hdc)) 
      { 
       g.DrawRectangle(Pens.Blue, new Rectangle(0, 0, Width - 1, Height - 1)); 
      } 
      ReleaseDC(this.Handle, hdc); 
     } 
    } 
} 
+0

Um auch zu sehen, wie man die fokussierte Randfarbe ändert, schauen Sie sich [diesen Beitrag] an (http://stackoverflow.com/a/38405319/3110834) –

+0

Auch [hier] (http: // stackoverflow.com/a/39420512/3110834) ist ein Beispiel für das Hinzufügen von 'BorderColor' -Eigenschaft für' TextBox'. –

+0

Es scheint, der Beitrag beantwortet Ihre Frage und es wäre toll, wenn Sie die Antwort akzeptieren. Ansonsten lassen Sie mich wissen, wenn Sie ein Problem bei der Anwendung der Antwort haben. Sehen Sie sich auch [linked post] (http://stackoverflow.com/a/39420512/3110834) an, das eine vollständige Implementierung der 'BorderColor'-Eigenschaft enthält. –

2

TextBox und MaskedTextBox Kontrollen sind nur Wrapper von Win32 Textboxsteuerelemente so Inhaber sie zeichnen (für benutzerdefinierte Grenzen, Overlays oder irgendetwas anderes) ist ein wenig komplexer als normal. Hier ist, was Sie tun sollten, um zu erreichen, was Sie versuchen zu tun.

  1. stammen aus MaskedTextBox: public class MaskedTextBoxWithBorder : MaskedTextBox
  2. Erhalten Sie Zugang zu den Nachrichtenstrom für die Win32-TextBox (es zeichnet sich in Reaktion auf mehrere Nachrichten, so dass Sie brauchen, um sie alle zu fangen nicht nur die Standard-WM_PAINT Nachricht).
  3. Holen Sie das Handle zum Gerätekontext und wandeln Sie es in ein verwaltetes Graphics-Objekt um, um den Rahmen zu zeichnen.

einen Blick auf die folgenden Artikel nehmen, die jeden Schritt im Detail erklärt: Adding an Icon or Control to a TextBox or ComboBox

Auch wenn der Artikel die grundlegenden Boxsteuerelement Text diskutiert, es spielt keine Rolle. Sowohl TextBox und MaskedTextBox stammen aus der TextBoxBase Klasse, die alle wichtigen Teile implementiert uns interessiert.

+0

Der Rahmen wird in einem Nicht-Client-Bereich gezeichnet und die einzige Nachricht, die Sie bearbeiten müssen, um einen Rahmen mit einer benutzerdefinierten Farbe zu zeichnen, ist 'WM_NCPAINT'. –

0

Nun, in der Regel in einer bestimmten Anwendung, nur ein paar Eigenschaft ändern, so dass Sie einfach könnte einige zusätzliche Eigenschaft zu Ihrem Benutzersteuerung für die Eigenschaften, die Sie in der Lage sein wollen, hinzufügen.

public class MaskedTextBoxWithBorder : UserControl 
{ 
    MaskedTextBox maskedtextBox; 

    // Other existing code... 

    public string Mask 
    { 
     get { return maskedtextBox.Mask; } 
     set { maskedtextBox.Mask = value; } 
    } 

    // Do same thing for other properties you want to change... 
} 

Wenn Sie wirklich eine Menge von Eigenschaften ändern wollen, dann werden andere Lösungen könnten besser geeignet sein ...

Verwandte Themen