2009-11-09 14 views
9

Czy istnieje sposób wyłączenia lub jeszcze lepszego narysowania własnego prostokąta ustawiania ostrości w celu regularnego sterowania przyciskami! (ta kropkowana linia wydaje się Windowss 95ish)C# WinForm: Usuń lub dostosuj "Focus Rectangle" dla przycisków

Zauważyłem, że właściwości kontrolne (PRZYCISKI FOR) nie mają ustawienia ownerdrawfixed (które nie wiem, czy to jest nawet droga do zastosowania dla rozwiązania, chociaż widziałem, jak był używany do dostosowywania innych kontrolek).

Odpowiedz

0

Podklasuj klasę przycisków i przesuń OnPaint. Jeśli twój override nie wywoła base.OnPaint, nic nie zostanie narysowane dla przycisku i będziesz miał pełną kontrolę (w tym prostokąt focus).

12

Uzyskanie tego prawa jest trudniejsze niż się wydaje. Bez wątpienia jeden z powodów, dla których niestandardowe malowanie przycisków nie jest możliwe do zastąpienia. To działało zgodnie z oczekiwaniami:

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.VisualStyles; 

class MyButton : Button { 
    private VisualStyleRenderer renderer; 
    protected override void OnPaint(PaintEventArgs e) { 
     base.OnPaint(e); 
     if (this.Focused && Application.RenderWithVisualStyles && this.FlatStyle == FlatStyle.Standard) { 
      if (renderer == null) { 
       VisualStyleElement elem = VisualStyleElement.Button.PushButton.Normal; 
       renderer = new VisualStyleRenderer(elem.ClassName, elem.Part, (int)PushButtonState.Normal); 
      } 
      Rectangle rc = renderer.GetBackgroundContentRectangle(e.Graphics, new Rectangle(0, 0, this.Width, this.Height)); 
      rc.Height--; 
      rc.Width--; 
      using (Pen p = new Pen(Brushes.DarkGray)) { 
       e.Graphics.DrawRectangle(p, rc); 
      } 
     } 
    } 
} 
+0

+1 Ten kod działa świetnie, ale nie rozumiem, w jaki sposób - nie ma żadnych atrybutów (takich jak [z możliwością przeglądania]), które są zwykle określone dla niestandardowych elementów sterujących? Dzięki. – Sabuncu

+0

Oczywiście, nie ma żadnych dodanych właściwości. To tylko zastępuje obraz. –

+0

Naprawdę niesamowite, po prostu przesłonięcie metody w formancie bazowym, możesz utworzyć nowy kontrolek! – Sabuncu

0

Jedno szybkie/brudne rozwiązanie, które znalazłem (tylko dla usunięcia prostokąta skupienia) wyraźnie określało kolor tła. Domyślny kolor kontrolny, na przykład:

this._dropDownButton.BackColor = System.Drawing.ColorTranslator.FromHtml("#F0F0F0"); 

EDYCJA: Wygląda na to, że to nie działa. W moim przypadku zostało to naprawione z powodu niezwiązanego z nim powodu. Przeprosiny.

8

Szybki i łatwy sposób wyłączyć prostokąta ostrości wszystko razem jest podklasy kontroli i obejmują ten kod:

public class CustomButton : Button 
{ 
    protected override bool ShowFocusCues 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+2

To niestety nie zadziałało dla mnie - nadal mogę dostać prostokąt na przycisku za pomocą klawiszy tabulacji lub strzałki. – theJerm

+1

Działa doskonale! Dzięki! Nie ma potrzeby zastępowania OnPaint() przy użyciu tej metody. – AlfredBr

+0

Podobnie jak @ theHerm, to też nie działa dla mnie, w sieci 4.5 – Memetican

2

Wystarczy prosty sposób.

Set

button.FlatStyle = Flat; 
button.FlatAppearance.BorderColor = Color.FromArgb(0, 255, 255, 255); 
button.FlatAppearance.BorderSize = 0; 
button.TabStop = false; 

FlatAppearance.BorderColor

zestaw na kod przyczyny nie mógł przezroczysty kolor ustawiony w trybie projektowania.

+0

Dlaczego po prostu nie ustawić "BorderSize" na 0? Jeśli chcesz mieć okropnie paskudny płaski guzik, to znaczy. –

Powiązane problemy