Ответ 1
Эта проблема не ограничивается WinForms... Поскольку элемент управления WinForms TreeView
- это просто оболочка вокруг собственного элемента управления Win32 TreeView, он рисует тот же стиль границы, что и элемент управления TreeView, в любом месте в системе, например как проводник Windows. И, как вы заметили, стиль 3D-границы выглядит по-разному с включенными визуальными стилями, чем в предыдущих версиях Windows. Фактически это не выглядит 3D вообще, эффект близок, если вы установите границу на Single
/FixedSingle
, за исключением того, что она немного слишком темная по сравнению с тем, что находится вокруг TreeView.
Насколько реплицируется это для элемента управления Panel
, я думаю, что трюк заключается не в рисовании ребра, а в рисовании фона.
Может быть более элегантное решение, если вы P/вызываете DrawThemeBackground
функцию непосредственно вместе с некоторыми Части и состояния, которые не отображаются в оболочке .NET VisualStyleRenderer
, но это выглядит довольно хорошо для меня:
VisualStyleRenderer renderer =
new VisualStyleRenderer(VisualStyleElement.Tab.Pane.Normal);
renderer.DrawBackground(e.Graphics, panel1.ClientRectangle);
(TreeView находится слева, панель справа).
Если вы хотите нарисовать границу самостоятельно и соответствовать цветам, используемым при включении визуальных стилей, вы тоже можете это сделать. Это будет просто определение правильного цвета, а затем использование стандартных процедур рисования GDI + для рисования линии или двух вокруг элемента управления.
Но пока не запускайте Photoshop! Все цвета документированы в файле с именем AeroStyle.xml
, расположенном в папке include
в Windows SDK. Вас интересуют значения 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>