2012-11-16 16 views
6

Tôi đang làm việc trên một ứng dụng Windows Form (C#, .NET 4.0, VS 2010), nơi tôi có một MainForm khá chuẩn với một ToolStrip (GripStyle: Hidden, Dock: Top, RenderMode: ManagerRenderMode). Toolstrip chứa một vài mục cơ bản (ToolStripLabel, ToolStripSeparator, ToolStripSplitButton).ToolStrip Rounded Corners

này được trả lại như sau:

ToolStrip rendered by default ManagerRenderMode

Lúc đầu, tôi chỉ đơn giản là muốn thêm một biên giới 'đáy' dưới toolstrip, nhưng tôi cũng nhận thấy rằng toolstrip này được trả lại với 'góc tròn' (bạn có thể thấy phần trên cùng và dưới cùng bên phải trong hình ảnh) và một đường thẳng đứng.

Làm cách nào để làm cho các góc này KHÔNG được làm tròn?

tôi đã cố gắng:

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

Và dây nó lên qua this.toolStrip_Actions.Renderer=new MainFormToolStripRenderer(); ở dạng khởi của tôi.

Điều này đã cho tôi đường viền dưới cùng, nhưng không làm bất cứ điều gì cho các góc tròn. Ngoài ra, với biên giới phía dưới nói thêm, các góc được làm tròn là đáng chú ý hơn:

ToolStrip rendered by custom ToolStripProfessionalRenderer

Tiếp theo, tôi cố gắng vẽ một hình chữ nhật trong thời gian xử lý sự kiện tương tự trên, thử (ít nhất) để ẩn các góc tròn và dọc gradient phía sau một đường viền hình chữ nhật vững chắc. Điều đó không hiệu quả vì vùng vẽ có sẵn (e.AffectedBounds) nằm trong các đường viền tròn.

Tôi cũng đã cố gắng đặt RenderMode của ToolStrip thành Hệ thống (và không sử dụng trình kết xuất của tôi). Trong trường hợp này, các góc của dụng cụ có vẻ vừa khít (hình chữ nhật), NHƯNG nút chia trong thanh công cụ dường như bị hỏng (nhấp vào mũi tên xuống không hiển thị menu thả xuống), vì các lý do chưa biết, và giao diện tổng thể -Cảm thấy một chút underwhelming (khá bằng phẳng, cho đến khi bạn di chuột vào một số nút trong toolstrip).

Tôi đoán cuối cùng tôi muốn gắn bó với ManageeRenderedMode hoặc trình kết xuất đồ họa tùy chỉnh kế thừa từ chuyên gia - nhưng tôi cần loại bỏ các góc được làm tròn. Trong số những người khác, tôi tìm thấy this SO Q dường như chỉ gần với những gì tôi đang xem nhưng không cho tôi câu trả lời cho trường hợp của tôi.

Cảm ơn trước

+1

Winforms là nỗi đau để hiển thị điều gì đó khác mà không tạo điều khiển hoàn toàn. Nó có thể là quá muộn bây giờ, nhưng bạn có rối tung với WPF/XAML? – iMortalitySX

+0

Cảm ơn, nhưng chúng tôi đã xem xét WPF trước đó và hiện tại chúng tôi đang cố gắng gắn bó với các biểu mẫu "cơ bản". Tôi không ngại kế thừa từ Toolstrip chuẩn nếu tôi cần ghi đè một số chi tiết nhất định, nhưng yeah: nó sẽ rất tuyệt nếu không phải render toàn bộ thứ đó (đặc biệt với splitbutton chúng ta cần bên trong nó, vv) – FOR

Trả lời

9

Hãy thử điều này trong lớp renderer của bạn:

public class MainFormToolStripRenderer : ToolStripProfessionalRenderer { 

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

tuyệt vời! Cảm ơn bạn (Tôi thực sự đặt thuộc tính .RoundedEdges thành false trong trình kết xuất tuỳ chỉnh của tôi, nhưng đó là mẹo)! Vẫn còn một chút rắc rối bởi vì bây giờ các góc không làm tròn nút tách ngừng hoạt động ... nhưng tôi sẽ chấp nhận câu trả lời của bạn vì nó đã giải quyết được vấn đề chính và đặt tôi vào đúng đường dẫn. – FOR

+2

thực sự, có một tùy chọn RenderMode trong các thuộc tính ToolStrip có 3 tùy chọn: System, Professional và ManagerRenderMode. Tùy chọn đầu tiên cho phép hệ điều hành làm cho ToolStrip không được làm tròn, và hai cuối cùng được làm tròn – am05mhz

2

Như am05mhz đề cập, bạn chỉ cần chọn RenderMode> Hệ thống và các góc bo tròn biến mất:

0

Xây dựng trên accepted answer bởi LarsTech, bạn không nhất thiết phải triển khai lớp Trình kết xuất mới, trừ khi có lý do thuyết phục để làm như vậy.

Bạn có thể làm điều này như một liner như sau:

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

hoặc từ các renderer mặc định cho một toolstrip với RenderMode thiết lập để ManagerRenderMode đã là một ToolStripProfessionalRenderer, bạn có thể bỏ nó như vậy và truy cập vào RoundedEdges tài sản trực tiếp như sau:

((ToolStripProfessionalRenderer)toolStrip_Actions.Renderer).RoundedEdges = false; 
Các vấn đề liên quan