2015-02-12 28 views
9

It's a rounded edges buttonYuvarlak kenarlar (WinForms)

Merhaba, ben yuvarlak kenarları düğme yaptık. Bu düğmeye çoğunda gösterir, ancak yuvarlatılmış kenarları göstermez, yani benim düğme parçası vurgulanan ve sivil parçası olduğu:

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

karşılaştığım sorun düğmenin "mavi vurgulamak" dir vurgulanmış (kenarlarda). Bunu çözmek için ne yapabilirim? Teşekkür ederim.

Not: WPF kullanamıyorum. Uygulama çok eski bir bilgisayar içindir; lütfen, bunu önermeyin. Ayrıca, müşterinin daha yeni bir bilgisayar almak için parası yok.

+3

Yan not kullanın: Eğer sadece bir kez bölgeyi belirlesin değil her boyada. –

+0

@LucasTrzesniewski Teşekkür ederim. – soulblazer

+0

Güncellenmiş yanıtımı görün! – TaW

cevap

9

Bu hızlı biridir biz bir sınıf var çünkü biz sınıf değişkeninde GraphicsPath önbelleğe alabilir, Açıkçası ..

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

ince ayar şeylere istiyoruz ve epeyce ayrıntı optimize edilebilir. Ve tabii ki o zaman, HTML ve CSS ile bir düğme yapmak, bir WebTarayıcı kullanabilirsiniz

enter image description here

+0

Eski bilgisayarlar için uygulamalar yapmak için çok zahmetli ... Bu kodu paylaştığınız için teşekkür ederiz! – soulblazer

+0

Bu iyi bir çözümdür. Ama yine de sınır çizgisi çok etkileyici değil. Aslında çok topal, bunu kullanmamı sağladı. –

+0

Eh, bir Graphics.SmoothingMode deneyebilirsiniz ama haklısın: Winforms glitz iyi değil .. – TaW

0

Resim yapmanın kısa yolu, yapabileceğiniz bir şey olduğunu sanmıyorum. Temel düğme boya mantığı, "pencere bölgesi ne olursa olsun böyle bir bölümün etrafında mavi bir vurgu göster" şeklinde yazılmaz. Bunun yerine, beklediği bölge türüyle yazılmıştır - dikdörtgen biçimindedir. Dolayısıyla, temel boya her zaman dikdörtgen bir görüntüyü kırpılmış bir şekle boyayacak. WPF'de böyle şeylerin daha kolay bir zamanına sahip olacaksınız.

+0

Uygulamanın güzel olmasını bekleyen, ancak daha yeni, daha grafik yetenekli bir bilgisayar satın almak istemeyen müşteriye bunu anlatmaya çalışın. Ona nasıl bir his vereceğimi bilmiyorum. Bir bilgisayar bir bilgisayar olduğu için, her şey için yararlı olacağı anlamına gelmez. – soulblazer

+2

Ayrıca, (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.region.aspx adresindeki belgeler gibi) Paint olayı işleyicinizde Bölge özelliğini ayarladığınızı görüyorum . Muhtemelen bunu yalnızca Düzen etkinliği için bir işleyicide yapmak istersiniz. Belgelerin zayıf bir örneği var ve oraya kadar bir açıklama yazacağım. :) –

+0

@Michael iyi yakalama, bu dokümanlar bazı tavsiyeler yapmak korkunç ...: - \ –

0

.. renk seçin webbrowser.DocumentText = "your html";

+0

Gerçekten bir WebBrowser WinForms üzerinde kullanabilir miyim? – soulblazer

+0

@Soulblazer Neden olmasın? – isaque

+0

Sadece merak ediyorum. Şimdiye kadar mümkün olduğunu hiç duymamıştım. Soruyu yanlış anladığını sanıyordum. Bunun için üzgünüm ve teşekkür ederim. – soulblazer