2015-02-12 22 views
9

It's a rounded edges buttonZaokrąglone krawędzie w przycisk C# (WinForms)

Witam, przez niektórych badań tu iw innych miejscach, zrobiłem przycisk zaokrąglonymi krawędziami.

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); 
} 

Problem jestem stoi to „niebieskie podświetlenie” przycisk na: To pokazuje, na najbardziej przycisku, ale nie pokazują na zaokrąglonymi krawędziami, więc mój przycisk jest podświetlony, a część część nie- podświetlone (na krawędziach). Co mogę zrobić, aby to rozwiązać? Dziękuję Ci.

PS: Nie mogę używać WPF. Aplikacja przeznaczona jest dla bardzo starego komputera; więc, proszę, nie sugeruj tego. Ponadto klient nie ma pieniędzy na zakup nowego komputera.

+3

Side Uwaga: Należy ustawić region tylko raz, nie na każdej farbie. –

+0

@LucasTrzesniewski Dziękuję. – soulblazer

+0

Zobacz moją zaktualizowaną odpowiedź! – TaW

Odpowiedz

9

Jest to szybki jeden, może chcesz dostroić rzeczy i optymalizacji sporo szczegółów ..

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); 
     } 
    } 
} 

Oczywiście, ponieważ mamy klasę możemy buforować GraphicsPath w zmiennej klasy. I oczywiście wybrać kolor ..

enter image description here

+0

To zbyt kłopotliwe, aby tworzyć aplikacje na stare komputery ... Dziękujemy za udostępnienie tego kodu! – soulblazer

+0

To jest dobre rozwiązanie. Ale nadal granica nie jest zbyt imponująca. Właściwie zbyt kulawy, że nie użyłem tego. –

+0

Cóż, można wypróbować Graphics.SmoothingMode, ale masz rację: WinForm nie jest dobry w blichtrze. – TaW

0

Skrót od malowania samemu, nie sądzę, że jest coś, co możesz zrobić. Podstawowa logika malowania przycisku nie jest napisana jako "pokaż niebieski punkt widoczny wokół takiej i takiej części dowolnego regionu okna". Zamiast tego jest napisany z typem regionu, jakiego oczekuje - prostokątny. Tak więc podstawowa farba zawsze będzie malować prostokątny obraz w przycięty kształt. Będziesz miał łatwiejszy czas takich rzeczy w WPF.

+0

Spróbuj powiedzieć to klientowi, który oczekuje, że aplikacja będzie piękna, ale nie chce kupować nowszego, bardziej graficznie działającego komputera. Nie wiem, jak wrzucić mu w to jakiś sens. Tylko dlatego, że komputer jest komputerem, nie znaczy, że będzie on przydatny we wszystkim. – soulblazer

+2

Ponadto zauważam, że Ty (podobnie jak dokumentacja na https://msdn.microsoft.com/en-us/library/system.windows.forms.control.region.aspx) ustawiasz właściwość Region w twojej procedurze obsługi zdarzeń Paint . Prawdopodobnie chcesz to zrobić tylko w module obsługi zdarzenia Layout. Dokumentacja ma słaby przykład i mam zamiar zostawić komentarz, aby stwierdzić tyle. :) –

+0

@Michael dobry połów, to straszna rada od dokumentów ...: - \ –

0

Można użyć WebBrowser, zrobić przycisk z HTML i CSS, a następnie użyć webbrowser.DocumentText = "your html";

+0

Czy rzeczywiście można używać WebBrowser na WinForms? – soulblazer

+0

@ Soulblazer Dlaczego nie? – isaque

+0

Po prostu zastanawiam się. Nigdy dotąd nie słyszałem, żeby było to możliwe. Myślałem, że źle odczytałeś pytanie lub coś. Przepraszam za to i dziękuję. – soulblazer