2011-08-20 36 views
12

Kiểu trực quan của Microsoft dành cho winforms luôn giấu giếm tôi.Màu đường viền của điều khiển Sử dụng VisualStyles

Tôi đang cố gắng để có một Panel ngồi bên cạnh một TreeView và chỉ có cùng một đường viền VisualStyle.

Border Colors

Như bạn thấy, biên giới TreeView khác với nỗ lực bản vẽ của tôi trong Panel tôi. BorderStyle của panel được thiết lập là None.

Tôi đã thử điều này:

Rectangle r = new Rectangle(0, 0, panel1.ClientRectangle.Width - 1, panel1.ClientRectangle.Height - 1); 
    using (Pen p = new Pen(VisualStyleInformation.TextControlBorder)) 
    e.Graphics.DrawRectangle(p, r); 

và tôi đã cố gắng này:

VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.TextBox.TextEdit.Normal); 
renderer.DrawEdge(e.Graphics, panel1.ClientRectangle, 
     Edges.Bottom | Edges.Left | Edges.Right | Edges.Top, 
     EdgeStyle.Sunken, EdgeEffects.Flat); 

Bất kỳ đề xuất cho màu biên giới thị giác đúng hay yếu tố trực quan để sử dụng không?

Trả lời

8

Vấn đề này không giới hạn đối với WinForms ... Vì điều khiển WinForms TreeView chỉ đơn giản là trình bao bọc xung quanh điều khiển Win32 TreeView gốc, nó vẽ cùng kiểu đường viền như điều khiển TreeView ở bất kỳ đâu trong hệ thống, chẳng hạn như Windows Explorer. Và như bạn đã quan sát, phong cách viền 3D trông khác với kiểu trực quan được kích hoạt hơn so với các phiên bản trước của Windows. Nó thực sự không nhìn 3D ở tất cả các hiệu ứng — gần hơn nếu bạn đặt đường viền là Single/FixedSingle, ngoại trừ việc nó hơi quá tối so với một xung quanh TreeView.

Theo như làm thế nào để tái tạo mà cho một điều khiển Panel, tôi nghĩ các trick không nằm trong bản vẽ một cạnh, mà là ở cách vẽ một nền.

Có thể có một giải pháp thanh lịch hơn nếu bạn P/Gọi các DrawThemeBackground function trực tiếp cùng với một số các Parts and States không được tiếp xúc trong wrapper NET VisualStyleRenderer, nhưng điều này có vẻ khá tốt với tôi:

VisualStyleRenderer renderer = 
       new VisualStyleRenderer(VisualStyleElement.Tab.Pane.Normal); 
renderer.DrawBackground(e.Graphics, panel1.ClientRectangle); 

     

      (các TreeView là ở bên trái; các Panel là ở bên phải.)

0.123.

Nếu bạn muốn vẽ đường viền và khớp với màu được sử dụng khi kiểu trực quan được bật, bạn cũng có thể thực hiện điều đó. Điều này đơn giản chỉ là vấn đề xác định màu sắc chính xác, và sau đó sử dụng các thường trình vẽ GDI + tiêu chuẩn để vẽ một hoặc hai dòng xung quanh điều khiển.

Nhưng đừng kích hoạt Photoshop! Tất cả các màu đều được ghi lại trong một tệp có tên là AeroStyle.xml, nằm trong thư mục include của Windows SDK. Bạn quan tâm đến các giá trị globals; sau đây:

<globals> 
    <EdgeDkShadowColor> 100 100 100</EdgeDkShadowColor> 
    <EdgeFillColor>  220 220 220</EdgeFillColor> 
    <EdgeHighLightColor>244 247 252</EdgeHighLightColor> 
    <EdgeLightColor> 180 180 180</EdgeLightColor> 
    <EdgeShadowColor> 180 180 180</EdgeShadowColor> 
    <GlowColor>   255 255 255</GlowColor> 
</globals> 
+0

Tôi đang phát xung quanh với DrawThemeBackground đó ngay bây giờ. Paint.NET cho tôi biết màu đường viền TreeView là (130, 135, 144). Đề xuất Tab.Pane.Normal của bạn khá gần, nhưng đó là (137, 140, 149). – LarsTech

2

cho tất cả các bạn quan tâm, here Tôi tìm thấy giải pháp, làm thế nào bạn có thể cho vẽ của Windows nền chính xác cho kiểm soát của bạn (sử dụng định nghĩa RECT từ pinvoke.net):

const string CLASS_LISTVIEW = "LISTVIEW"; 
const int LVP_LISTGROUP = 2; 

[DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)] 
private extern static int DrawThemeBackground(IntPtr hTheme, IntPtr hdc, int iPartId, int iStateId, ref RECT pRect, IntPtr pClipRect); 

public static void DrawWindowBackground(IntPtr hWnd, Graphics g, Rectangle bounds) 
{ 
    IntPtr theme = OpenThemeData(hWnd, CLASS_LISTVIEW); 
    if (theme != IntPtr.Zero) 
    { 
     IntPtr hdc = g.GetHdc(); 
     RECT area = new RECT(bounds); 
     DrawThemeBackground(theme, hdc, LVP_LISTGROUP, 0, ref area, IntPtr.Zero); 
     g.ReleaseHdc(); 
     CloseThemeData(theme); 
    } 
} 
Các vấn đề liên quan