2011-08-20 6 views
12

Microsoft의 시각적 스타일 winforms는 항상 저를 괴롭 힙니다.VisualStyles를 사용하는 컨트롤 테두리 색상

Panel 옆에 앉아서 TreeView 옆에 앉아서 같은 VisualStyle 테두리가 있습니다.

Border Colors

당신이 볼 수 있듯이

TreeView 테두리 내 Panel 내 드로잉을 시도 다릅니다. 패널의 BorderStyle이 None으로 설정됩니다.

나는이 시도했다 :

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

을하고 나는이 시도했다 : 사용할 올바른 시각 테두리 색상 또는 시각적 요소에 대해

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

어떤 제안?

답변

8

이 문제는 WinForms에만 국한되지 않습니다. WinForms TreeView 컨트롤은 단순히 네이티브 Win32 TreeView 컨트롤에 대한 래퍼이므로 TreeView 컨트롤과 같은 테두리 스타일을 그리는 것입니다. 윈도우 익스플로러. 이전 버전의 Windows에서 사용했던 것보다 시각적 스타일을 사용하면 3D 테두리 스타일이 다르게 보입니다. 실제로 3D로 보지 않습니다. Single/FixedSingle으로 테두리를 설정하면 효과가 더 가까워집니다. 단, TreeView 주변의 경우와 비교하면 너무 어둡습니다.

는 지금까지 Panel 제어를 위해이를 복제하는 방법으로, 나는 트릭이 가장자리 도면에없는 거짓말을하지만, 오히려 배경 그리기에 생각합니다.

당신이 P/직접 .NET VisualStyleRenderer 래퍼에 노출되지 않은 Parts and States의 일부와 함께 DrawThemeBackground function를 호출하지만,이 일이 나에게 아주 잘 보이는 경우 더 우아한 해결책이있을 수 있습니다 :

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

     

     은 (트리 뷰는 왼쪽에, 패널이 오른쪽이다.)

0,123,

테두리를 직접 그려보고 비주얼 스타일을 사용할 때 사용되는 색상과 일치 시키려면 그렇게 할 수 있습니다. 이것은 단순히 올바른 색상을 결정한 다음 표준 GDI + 드로잉 루틴을 사용하여 컨트롤 주위에 한 줄 또는 두 줄을 그립니다.

Photoshop을 아직 시작하지 마십시오! 색상은 Windows SDK의 include 폴더에있는 AeroStyle.xml 파일에 모두 설명되어 있습니다. globals 값에 관심이 있습니다. 이 : 관심이 모두를위한

<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

지금 당장 그 DrawThemeBackground로 놀고 있습니다. Paint.NET은 TreeView 테두리 색이 (130, 135, 144)라고 알려줍니다. 너의 Tab.Pane.Normal 제안은 꽤 가까웠다. 그러나 그것은 (137, 140, 149)이었다. – LarsTech

2

, here 난 당신이 윈도우 컨트롤에 대한 올바른 배경 (PInvoke를에서 사용 RECT 정의 그려 보자 방법, 해결책을 발견했다.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); 
    } 
} 
관련 문제