2011-08-20 24 views
12

Los estilos visuales de Microsoft para winforms siempre me han desconcertado.Color de borde de controles utilizando VisualStyles

Estoy tratando de tener un Panel sentado junto a un TreeView y solo tengo el mismo borde VisualStyle.

Border Colors

Como se puede ver, la frontera TreeView es diferente a mis intentos de dibujo en mi Panel. El BorderStyle del panel está establecido en Ninguno.

He intentado esto:

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

y he intentado esto:

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

alguna sugerencia para el color del borde visual correcta o elemento visual a utilizar?

Respuesta

8

Este problema no está limitado a WinForms ... Dado que el control WinForms TreeView es simplemente un envoltorio alrededor del control nativo Win32 TreeView, dibuja el mismo estilo de borde que un control TreeView en cualquier otro lugar del sistema, como Explorador de Windows. Y como ha observado, el estilo de borde 3D se ve diferente con estilos visuales habilitados que en versiones anteriores de Windows. En realidad, no se ve en 3D — el efecto está más cerca si configura el borde en Single/FixedSingle, excepto que es un poco oscuro en comparación con el que está alrededor de TreeView.

En cuanto a la forma de replicar que para un control Panel, creo que el truco no radica en la elaboración de un borde , sino más bien en la elaboración de un fondo .

Puede haber una solución más elegante si P/invocar la DrawThemeBackground function directamente junto con algunos de los Parts and States que no se exponen en el .NET VisualStyleRenderer envoltorio, pero éste se ve muy bien para mí:

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

     

      (el TreeView está a la izquierda; el Panel está a la derecha.)


Si desea dibujar el borde usted mismo y hacer coincidir los colores utilizados cuando se habilitan los estilos visuales, puede hacerlo también. Esto simplemente sería una cuestión de determinar el color correcto y luego usar las rutinas de dibujo estándar GDI + para dibujar una o dos líneas alrededor del control.

¡Pero no encienda Photoshop todavía! Los colores están documentados en un archivo llamado AeroStyle.xml, ubicado en la carpeta include del SDK de Windows. Le interesan los valores globals; éstos:

<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

Estoy jugando con ese DrawThemeBackground en este momento. Paint.NET me dice que el color del borde de TreeView es (130, 135, 144). Su sugerencia Tab.Pane.Normal fue bastante cercana, pero fue (137, 140, 149). – LarsTech

2

para todos ustedes interesados, here he encontrado la solución, cómo se puede dejar que dibuja el fondo de Windows correcta para su control (uso definición de RECT PInvoke.neto):

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