2015-02-12 2 views
9

It's a rounded edges buttonDie abgerundeten Kanten in die Taste C# (WinForms)

Hallo, durch einige der Forschung hier und auf anderen Websites, ich habe eine abgerundete Kanten Taste.

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    Rectangle Rect = new Rectangle(0, 0, this.Width, this.Height); 
    GraphicsPath GraphPath = new GraphicsPath(); 
    GraphPath.AddArc(Rect.X, Rect.Y, 50, 50, 180, 90); 
    GraphPath.AddArc(Rect.X + Rect.Width - 50, Rect.Y, 50, 50, 270, 90); 
    GraphPath.AddArc(Rect.X + Rect.Width - 50, Rect.Y + Rect.Height - 50, 50, 50, 0, 90); 
    GraphPath.AddArc(Rect.X, Rect.Y + Rect.Height - 50, 50, 50, 90, 90); 
    this.Region = new Region(GraphPath); 
} 

Das Problem, das ich mit Blick auf bin ist die „blaue Markierung“ der Schaltfläche: Es ist auf den meisten der Taste zeigt, aber es auf den abgerundeten Kanten nicht zeigen, so meine Taste nicht Teil hervorgehoben und einen Teil hervorgehoben (an den Rändern). Was könnte ich tun, um das zu lösen? Vielen Dank.

PS: Ich kann WPF nicht verwenden. Die Anwendung ist für einen sehr alten Computer; also, bitte, schlage es nicht vor. Außerdem hat der Kunde nicht das Geld, um einen neueren Computer zu bekommen.

+3

Side Hinweis: Sie sollten die Region setzen nur einmal, nicht auf jeder Farbe. –

+0

@LucasTrzesniewski Vielen Dank. – soulblazer

+0

Siehe meine aktualisierte Antwort! – TaW

Antwort

9

Dies ist eine kurze ein, können Sie eine Feinabstimmung Dinge wollen und optimieren schon einige Details ..

class RoundedButton : Button 
{ 
    GraphicsPath GetRoundPath(RectangleF Rect, int radius) 
    { 
     float r2 = radius/2f; 
     GraphicsPath GraphPath = new GraphicsPath(); 

     GraphPath.AddArc(Rect.X, Rect.Y, radius, radius, 180, 90); 
     GraphPath.AddLine(Rect.X + r2, Rect.Y, Rect.Width - r2, Rect.Y); 
     GraphPath.AddArc(Rect.X + Rect.Width - radius, Rect.Y, radius, radius, 270, 90); 
     GraphPath.AddLine(Rect.Width, Rect.Y + r2, Rect.Width, Rect.Height - r2); 
     GraphPath.AddArc(Rect.X + Rect.Width - radius, 
         Rect.Y + Rect.Height - radius, radius, radius, 0, 90); 
     GraphPath.AddLine(Rect.Width - r2, Rect.Height, Rect.X + r2, Rect.Height); 
     GraphPath.AddArc(Rect.X, Rect.Y + Rect.Height - radius, radius, radius, 90, 90); 
     GraphPath.AddLine(Rect.X, Rect.Height - r2, Rect.X, Rect.Y + r2); 

     GraphPath.CloseFigure(); 
     return GraphPath; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     RectangleF Rect = new RectangleF(0, 0, this.Width, this.Height); 
     GraphicsPath GraphPath = GetRoundPath(Rect, 50); 

     this.Region = new Region(GraphPath); 
     using (Pen pen = new Pen(Color.CadetBlue, 1.75f)) 
     { 
      pen.Alignment = PenAlignment.Inset; 
      e.Graphics.DrawPath(pen, GraphPath); 
     } 
    } 
} 

Offensichtlich, da wir eine Klasse haben, können wir die GraphicsPath in einer Klassenvariablen zwischenzuspeichern. Und natürlich können Sie die Farbe auswählen ..

enter image description here

+0

Es ist zu mühsam, Apps für alte Computer zu machen ... Vielen Dank für die Freigabe dieses Codes! – soulblazer

+0

Dies ist eine gute Lösung. Trotzdem ist die Grenze nicht sehr beeindruckend. Eigentlich zu lahm, das hat mich dazu gebracht, das nicht zu benutzen. –

+0

Nun, könnte man einen Graphics.SmoothingMode versuchen, aber Sie haben Recht: Winforms ist nicht gut in Glitz .. – TaW

0

Kurz von selbst malen, ich glaube nicht, dass Sie etwas tun können. Die Logik für die Basis-Schaltfläche wird nicht als "blaue Hervorhebung um diesen oder jenen Teil von dem, was die Fensterregion ist" angezeigt. Stattdessen ist es mit der Art der Region geschrieben, die es erwartet - eine rechteckige. Die Grundfarbe wird also immer ein rechteckiges Bild in eine beschnittene Form malen. In WPF wird es Ihnen leichter fallen.

+0

Versuchen Sie das dem Kunden mitzuteilen, der erwartet, dass die App schön ist, aber keinen neueren, grafischeren Computer kaufen möchte. Ich weiß nicht, wie ich ihm etwas einfallen lassen kann. Nur weil ein Computer ein Computer ist, heißt das nicht, dass er für alles nützlich ist. – soulblazer

+2

Außerdem stelle ich fest, dass Sie (wie die Dokumentation unter https://msdn.microsoft.com/en-us/library/system.windows.forms.control.region.aspx) die Region-Eigenschaft in Ihrem Paint-Ereignishandler festlegen . Wahrscheinlich möchten Sie dies nur in einem Handler für das Layout-Ereignis tun. Die Dokumentation hat ein schlechtes Beispiel und ich werde einen Kommentar dort hinterlassen, um dies zu sagen. :) –

+0

@Michael guten Fang, das ist ein schrecklicher Ratschlag von der Docs ...: - \ –

0

Sie einen Web-Browser verwenden können, stellen Sie eine Schaltfläche mit HTML und CSS, dann verwenden webbrowser.DocumentText = "your html";

+0

Können Sie tatsächlich einen Webbrowser auf WinForms verwenden? – soulblazer

+0

@Soulblazer Warum nicht? – isaque

+0

Ich frage mich nur. Ich hatte noch nie gehört, dass das bis jetzt möglich war. Ich dachte, du hättest die Frage falsch verstanden oder so. Entschuldigung und danke. – soulblazer

Verwandte Themen