2016-05-12 4 views
1

Ich versuche, eine Elipse in einem Textfeld mit Doppelklick zu erstellen. Aber es scheint nicht zu passieren.Konnte keine Ellipse beim Mausdoppelklickereignis erstellen

panel.MouseClick += create_terms; 

private void create_terms(object sender, EventArgs arg) 
{ 
    if (Phys_terms_check.Checked == true) 
    { 
     MouseEventArgs e = (MouseEventArgs)arg; 
      Graphics g = CreateGraphics(); 
      SolidBrush p = new SolidBrush(Color.Red); 
      Pen erase = new Pen(Color.White); 

      Panel panel = (Panel)sender; 
      g.FillEllipse(p, e.X+panel.Left,e.Y+panel.Top,10,10); 
    } 
} 

Die e.x und e.y scheinen relative Koordinaten von dem Sender zu geben. Wie bekomme ich einen Bezug zum Formular?

+1

__NEVER__ Verwenden Sie 'Graphics g = CreateGraphics();' Fügen Sie stattdessen den Punkt zu einer Liste hinzu und schreiben Sie das Paint-Ereignis, um Ellipsen an allen diesen Punkten mit seinem e.Graphics-Ereignis zu zeichnen. Nachdem Sie dem Listenaufruf einen Punkt hinzugefügt haben, rufen Sie das Steuerelement auf, für das Sie zeichnen möchten.Außerdem: 'TextBoxes' sind nicht wirklich glücklich, wenn Sie auf ihnen zeichnen möchten; Sie können sehen, dass von der Tatsache, dass sie nicht einmal ein Paint-Ereignis haben !! __ Besser verwenden Sie ein Panel oder wenn Sie Text darauf sowie ein Label wollen. (Btw: Etiketten werden stark unterschätzt) – TaW

+0

Kannst du näher erläutern, wie das Paint-Event aufgerufen wird? Ich muss dies jedes Mal aufrufen, wenn der Benutzer auf das Panel doppelklickt. –

+0

Wenn Sie ein Panel (oder Label) verwenden möchten, doppelklicken Sie einfach auf das Paint-Ereignis im Eigenschaftsfenster-Events-Panel des Panels! Für [Ereignisse verbinden] (http://stackoverflow.com/questions/33275763/copy-datagridview-values-to-textbox/33276161?s=2|0.3896#33276161) lesen Sie dies. Zum Zeichnen von Ellipsenlisten [siehe diesen Beitrag] (http://stackoverflow.com/questions/36924016/how-to-draw-multiple-ellipse-in-the-same-panel/36924235#36924235) - Noch eine Bemerkung: Die 'Graphics g = CreateGraphics();' erstellt ein Graphics-Objekt, das Sie nur zum Zeichnen von __nicht persistenten Grafiken__ auf das __Form__ verwenden können. – TaW

Antwort

0

fügen Sie die oberen und linken Koordinaten des Senders hinzu.

g.FillEllipse(p, e.X + textbox.Left, e.Y + textbox.Top, 10, 10); 

aber dies wird nicht angezeigt, weil Textbox malen Ereignis Feuer füllen und Textbox neu streichen.

0

Zunächst einmal: TextBoxes sind alte Legacy und ziemlich spezielle Controls, die nicht alle Dinge unterstützen, die normale Kontrollen Sie tun können.

Unter den Dingen, die nicht

  • Einstellen eines Background
  • Besitzer Zieh sie

Letzteres schließt jede Zeichnung in seiner Paint/OnPaint Ereignisse funktionieren.

Sie können Code und Aufschaltung der Paint Ereignis, aber es wird nicht aufgerufen.

Sie noch können auf eine TextBox zeichnen CreateGraphics verwenden, wenn Sie es richtig machen, aber wie immer mit dieser Funktion das Ergebnis nicht-persistent und wird, sobald das System aktualisiert sich die TextBox weggehen, Das ist super-schnell: sobald Sie den Cursor über den Kreis bewegen Sie verschwinden ziehen kann ..

Der Code zu tun, würde es ähnlich wie folgt aussehen müssen:

Graphics g = yourTextBox.CreateGraphics(); 
g.FillEllipse(Brushes.Red, yourTextBox.Width - 22, 2, 11, 11); 

Aber Wie ich schon sagte, wird das nicht weiter bestehen, also hat es wenig oder keinen Wert.

Wenn Sie auf etwas mit einer sichtbaren Text Eigenschaft ziehen möchten, können Sie ein Label verwenden:

private void yourLabel_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.FillEllipse(Brushes.Red, yourLabel.Width - 22, 2, 11, 11); 
} 

enter image description hereenter image description here

Das Ergebnis gleich aussieht, aber nur der Punkt in den Label wird persistent, z a Minimize-Maximize des Formulars .. In der Tat überlebte der Punkt in der TextBox nicht einmal den Aufruf meiner Screenshot-Programm, so hatte ich verwenden, drücken Sie die Print-Key!

Für drawing circles upon mouseclicks onto normal controls see this post!

Verwandte Themen