2011-08-20 21 views
12

Microsoft'un winform'lar için görsel stilleri beni her zaman şaşırttı.VisualStyles Kullanarak Denetimlerin Kenarlık Rengi

PanelTreeView'un yanında oturmaya çalışıyorum ve aynı VisualStyle kenarlıklarına sahip oldum.

Border Colors

Gördüğünüz gibi

, TreeView sınır benim Panel benim çizim girişimleri farklıdır. Panelin BorderStyle'ı Yok olarak ayarlandı.

Bu denedim:

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

ve ben bu denedim: kullanılacak doğru görsel sınır rengi veya görsel öğe için

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

bir öneriniz?

cevap

8

Bu sorun, WinForms ile sınırlı değil ... WinForms TreeView denetimi, yerel Win32 TreeView denetiminin etrafındaki bir sarıcı olduğu için, TreeView denetiminin sistemdeki başka herhangi bir yerde olduğu gibi aynı kenarlık stilini çiziyor. Windows Gezgini Ve gözlemlediğiniz gibi, 3D kenarlık stili, Windows'un önceki sürümlerinde olduğundan daha etkin olan görsel stillerle farklı görünür. Aslında —'da 3D görünmüyorsa, kenarlık Single/FixedSingle olarak ayarlandığında, TreeView'un etrafındaki ile karşılaştırıldığında biraz fazla karanlık olması dışında efekt daha yakındır.

Bildiğim kadarıyla bir Panel kontrolü için bu çoğaltmak için nasıl, ben hile bir kenar çizim yatar, daha ziyade bir arka planı çizim düşünüyorum.

P/doğrudan .NET VisualStyleRenderer ambalajında ​​maruz kalmaz Parts and States bazılarıyla birlikte DrawThemeBackground function Çağır, ama bu bana oldukça iyi görünüyor eğer daha zarif bir çözüm olabilir:

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

     

      (TreeView solda olduğu; panel sağdadır.)

0.123.

Kenarlığı kendiniz çizmek ve görsel stiller etkin olduğunda kullanılan renkleri eşleştirmek istiyorsanız, bunu da yapabilirsiniz. Bu sadece doğru rengi belirleme meselesi ve daha sonra standart GDI + çizim rutinlerini kullanarak kontrolün etrafında bir çizgi ya da iki tane çizmek olacaktır.

Ancak henüz Photoshop'ta ateş etme! Renkler, Windows SDK'nın include klasöründe bulunan AeroStyle.xml isimli bir dosyada belgelenmiştir. globals değerleriyle ilgileniyorsunuz; Bu: ilgilenen hepiniz için

<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

Şu anda bu DrawThemeBackground ile oynuyorum. Paint.NET bana TreeView sınır rengini anlatıyor (130, 135, 144) 'dir. Kişisel Tab.Pane.Normal öneri oldukça yakın, ama (137, 140, 149) idi. – LarsTech

2

, here Ben Windows kontrolünüz için doğru plan (Pınvoke gelen kullanım RECT tanımı çizelim nasıl, çözüm buldu.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); 
    } 
} 
İlgili konular