2010-04-05 23 views
6

Tôi muốn vẽ một tùy chỉnh TabControl bằng chức năng tùy chỉnh.TabRenderer không có kiểu trực quan nào được bật?

Để thực hiện việc này, tôi đã kế thừa lớp Bảng điều khiển và ghi đè phương thức OnPaint để vẽ bằng lớp TabRenderer.

Vấn đề là TabRenderer chỉ hoạt động khi kiểu trực quan được bật (có thể được kiểm tra với TabRenderer.IsSupported), nhưng tôi nên làm gì nếu kiểu trực quan bị tắt?

Trong trường hợp này, tôi nghĩ sử dụng lớp ControlPaint để vẽ các tab không có kiểu trực quan, nhưng nó không có phương thức vẽ liên quan đến tab. Tôi muốn nó về cơ bản hành xử trực quan như thường lệ TabControl.

+0

Bằng cách nào bạn muốn 'TabControl' tùy chỉnh khác với' System.Windows.Forms.TabControl'? –

+0

Cho phép hoạt ảnh dưới dạng biểu tượng của Tab, Cho phép tùy chỉnh nút X chết trên mỗi Tab, Thay đổi vị trí và bản vẽ của nút trái và phải khi điều khiển tab không vừa với chiều rộng của điều khiển, cho phép nhấp chuột phải vào tab đóng bằng nút chuột giữa, cho phép kéo và thả các trang tab ... Tôi muốn các tab có chức năng giống như trong firefox. – DxCK

Trả lời

5

Bạn phải tự vẽ nó vì không có API được xuất bản cho điều này. Hy vọng rằng điều này là tương đối dễ dàng để làm điều đó theo cách không hình ảnh.

Bạn có thể vẽ biên giới cửa sổ với ControlPaint.DrawBorder3D và sử dụng một cái gì đó giống như đoạn mã sau cho các nút:

int Top = bounds.Top; 
int Bottom = bounds.Bottom - 1; 
int Sign = 1; 

if (tabStrip.EffectiveOrientation == TabOrientation.Bottom) 
{ 
    Top = bounds.Bottom - 1; 
    Bottom = bounds.Top; 
    Sign = -1; 
} 

using (Pen OuterLightBorderPen = new Pen(SystemColors.ControlLightLight)) 
{ 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Bottom, bounds.Left, Top + 2 * Sign); 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Top + 2 * Sign, bounds.Left + 2, Top); 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left + 2, Top, bounds.Right - 3, Top); 
} 

using (Pen InnerLightBorderPen = new Pen(SystemColors.ControlLight)) 
{ 
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 1, Bottom, bounds.Left + 1, Top + 2 * Sign); 
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 2, Top + 1 * Sign, bounds.Right - 3, Top + 1 * Sign); 
} 

using (Pen OuterDarkBorderPen = new Pen(SystemColors.ControlDarkDark)) 
{ 
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 2, Top + 1 * Sign, bounds.Right - 1, Top + 2 * Sign); 
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 1, Top + 2 * Sign, bounds.Right - 1, Bottom); 
} 

using (Pen InnerDarkBorderPen = new Pen(SystemColors.ControlDark)) 
    e.Graphics.DrawLine(InnerDarkBorderPen, bounds.Right - 2, Top + 2 * Sign, bounds.Right - 2, Bottom); 
+3

bạn có thể đơn giản hóa điều này rất nhiều bằng cách sử dụng SystemPens - http://msdn.microsoft.com/en-us/library/system.drawing.systempens.aspx – Simon

+0

Cảm ơn mã này! Có vẻ như thật! Cảm ơn! :-D – DxCK

0

Đây là một "hiện có" câu trả lời nhưng là nó có thể mà bạn có thể sử dụng WPF? Như bạn có thể thấy từ câu trả lời ở trên nó là một nỗi đau trong tai để tùy chỉnh điều khiển trong winforms, nơi như trong WPF mỗi kiểm soát là vô nghĩa. Điều này có nghĩa là bạn kiểm soát những gì được hiển thị và nó trông hoàn toàn như thế nào.

+0

Cảm ơn bạn đã gợi ý, nhưng tôi cần hỗ trợ windows 2000 vì vậy WPF không phải là một tùy chọn cho tôi ngay bây giờ. – DxCK

Các vấn đề liên quan