2012-11-16 5 views
6

Pracuję nad aplikacją Windows Form (C#, .NET 4.0, VS 2010), w której mam dość standardowy MainForm z ToolStripem (GripStyle: Hidden, Dock: Top, RenderMode: ManagerRenderMode). Pasek narzędzi zawiera kilka podstawowych elementów (ToolStripLabel, ToolStripSeparator, ToolStripSplitButton).ToolStrip Rounded Corners

ten staje się następująco:

ToolStrip rendered by default ManagerRenderMode

Na początku po prostu chciał dodać „bottom” granicę poniżej ToolStrip, ale również zauważyć, że ten ToolStrip jest renderowany z „zaokrąglone rogi” (możesz zobaczyć górną i dolną prawą stronę obrazu) i pionową linię gradientu.

Jak mogę te narożniki NIE zaokrąglić?

Próbowałem:

public class MainFormToolStripRenderer : ToolStripProfessionalRenderer 
{ 
    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) 
    { 
     base.OnRenderToolStripBorder(e); 

     var y = e.ToolStrip.Height-1; 
     e.Graphics.DrawLine(new Pen(SystemColors.ControlDark, 1), new Point(0, y), new Point(e.ToolStrip.Width, y)); 
    } 

i przewodowy go poprzez this.toolStrip_Actions.Renderer=new MainFormToolStripRenderer(); w moim inicjalizacji formularza.

Dało mi to dolną granicę, ale nic nie zrobiłem dla zaokrąglonych narożników. Ponadto, z dodatkową dolną granicę, zaokrąglone rogi są bardziej zauważalne:

ToolStrip rendered by custom ToolStripProfessionalRenderer

Następny Próbowałem rysując prostokąt podczas tej samej procedury obsługi zdarzeń powyżej, aby spróbować (co najmniej), aby ukryć zaokrąglone narożniki i pionowy gradient za solidną prostokątną ramką. To nie zadziałało, ponieważ dostępny obszar rysowania (e.AffectedBounds) znajduje się w zaokrąglonych granicach.

Próbowałem również ustawić RenderMode ToolStrip na System (i nie używać mojego renderer). W tym przypadku narożniki paska narzędziowego wydają się pasować ciasno (prostokątnie), ALE przycisk podziału w pasku narzędzi wydaje się być zepsuty (kliknięcie strzałki w dół nie wyświetla listy rozwijanej), z jeszcze nieznanych przyczyn i ogólnego wyglądu-n -dymek jest nieco rozczarowujący (całkiem płaski, dopóki nie zatrzymasz się na niektórych przyciskach na pasku narzędziowym).

Podejrzewam, że wolałbym pozostać przy ManageeRenderedMode lub niestandardowym rendererze dziedziczącym po profesjonalnym - ale muszę pozbyć się zaokrąglonych narożników. Między innymi znalazłem this SO Q, który wydaje się wskazywać blisko tego, na co patrzę, ale nie dał mi odpowiedzi na moją sprawę.

góry dzięki

+1

WinFormacja jest bólem do renderowania czegoś innego bez tworzenia całkowicie własnej kontroli. Być może teraz jest już za późno, ale czy masz problemy z WPF/XAML? – iMortalitySX

+0

Dzięki, ale wcześniej przyjrzeliśmy się WPF i na razie próbujemy trzymać się "podstawowych" winformów. Nie mam nic przeciwko dziedziczeniu ze standardowego paska narzędziowego, jeśli muszę przesłonić pewne szczegóły, ale tak: byłoby miło, gdybyśmy nie musieli renderować całej sprawy samodzielnie (zwłaszcza przy użyciu przycisku podziału, którego potrzebujemy w środku, itp.) – FOR

Odpowiedz

9

Spróbuj tego w swojej klasie renderer:

public class MainFormToolStripRenderer : ToolStripProfessionalRenderer { 

    public MainFormToolStripRenderer() { 
    this.RoundedEdges = false; 
    } 
} 
+0

niesamowite! Dziękuję (faktycznie ustawiłem właściwość .RoundedEdges na false w moim niestandardowym rendererze, ale to była podstęp)! Ciągle mam problem, ponieważ teraz, gdy rogi nie są zaokrąglone, przycisk podziału przestał działać ... ale przyjmuję twoją odpowiedź, ponieważ rozwiązał pierwotny problem i postawił mnie na właściwej ścieżce. – FOR

+2

w rzeczywistości istnieje właściwość RenderMode we właściwościach ToolStrip, która ma 3 opcje: System, Professional i ManagerRenderMode. Pierwsza opcja pozwala systemowi wyświetlać ToolStrip, który NIE jest zaokrąglony, a dwa ostatnie są zaokrąglone – am05mhz

2

Jak am05mhz wspomniano, wystarczy wybrać RenderMode> System i zaokrąglone rogi znikną:

0

Budowanie na accepted answer przez LarsTech, niekoniecznie musisz zaimplementować nową klasę Renderer, chyba że istnieją ku temu ważne powody.

Można to zrobić za pomocą jednej wkładki w następujący sposób:

toolStrip_Actions.Renderer = new ToolStripProfessionalRenderer() { RoundedEdges = false }; 

lub od domyślnej renderujący dla ToolStrip z RenderMode ustawiony ManagerRenderMode jest już ToolStripProfessionalRenderer, można rzucać je jako takie i dostęp do RoundedEdges Właściwość bezpośrednio w następujący sposób:

((ToolStripProfessionalRenderer)toolStrip_Actions.Renderer).RoundedEdges = false; 
Powiązane problemy