锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C#开源 / C#界面控件 / WinForm边缘阴影、控件边缘阴影、Panel边缘阴影
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。

WinForm边缘阴影、控件边缘阴影、Panel边缘阴影


背景

最近给上市公司完成项目里,有个边缘阴影的UI效果,甲方是以网页形式参考出的UI图,而WinForm形式和网页形式差的十万八千里,实现阴影很麻烦,特别是在复杂的环境里。

网页和Windows的WPF是整体渲染,而WinForm一般是控件窗口自己负责,所以窗口外的区域控制不了,很麻烦,所以一般开发人员看到WinForm边缘阴影、控件边缘阴影和Panel边缘阴影都会头疼,本文后面内容是翻译内容,国外的开发人员的反应也是很头疼,回答的人是驴唇不对马嘴,有些跑题。不过里面的代码的精神值得学习,用UI库实现阴影是个方式,用GraphicsPath路径的技巧,是文章里两个要点。

下面是翻译内容:

 

我有一个包含其他控件的可移动面板。我想给面板添加一个 DropShadow 效果让它看起来不错,所以我使用了以下代码:

  1. private DevExpress.Utils.FormShadow.PopupFormShadow ShadowNew = new DevExpress.Utils.FormShadow.PopupFormShadow();
  2. //Assigned the panel
  3. ShadowNew.Form = panelControl1;

隐藏阴影的代码是:

  1. ShadowNew.Form = null;

这很好用,直到我滚动。面板的某些部分不可见,这是正常的,但该部分的阴影仍然可见。我现在要做的是寻找一种方法来检测使用滚动时面板或面板的一部分何时不可见,以便我可以隐藏阴影,并且当面板完全可见时显示阴影。

任何建议

我正在寻找一个替代的阴影,但没有什么比这更好的了。

真诚的问候,

 

 

我可以在这里找到 VB 代码中的解决方案:showthread.php

部分 C# 代码是:

  1. // This will verify if the right side of the panel is not in the forms viewable area and will hide the shadow, else it will show it.
  2. Rectangle myBounds = this.ClientRectangle;
  3. if (myBounds.Right < panelControl1.Right)
  4. {
  5. ShadowNew.Form = null;
  6. }
  7. else
  8. {
  9. ShadowNew.Form = panelControl1;
  10. }

 

 

 

您可以尝试使用GraphicsPath绘制平滑阴影。
这是您可以参考的测试 coed 示例。

  1. public Form1()
  2. {
  3. InitializeComponent();
  4. shadowControls.Add(panel1);
  5. this.Refresh();
  6. }
  7. List<Control> shadowControls = new List<Control>();
  8. Bitmap shadowBmp = null;
  9. Point PanelMouseDownLocation;
  10. private void panel1_MouseDown(object sender, MouseEventArgs e)
  11. {
  12. if (e.Button == MouseButtons.Left) PanelMouseDownLocation = e.Location;
  13. }
  14. private void panel1_MouseMove(object sender, MouseEventArgs e)
  15. {
  16. if (e.Button == MouseButtons.Left)
  17. {
  18. panel1.Left += e.X - PanelMouseDownLocation.X;
  19. panel1.Top += e.Y - PanelMouseDownLocation.Y;
  20. this.Refresh();
  21. }
  22. }
  23. private void Form1_Paint(object sender, PaintEventArgs e)
  24. {
  25. if (shadowBmp == null || shadowBmp.Size != this.Size)
  26. {
  27. shadowBmp?.Dispose();
  28. shadowBmp = new Bitmap(this.Width, this.Height, PixelFormat.Format32bppArgb);
  29. }
  30. foreach (Control control in shadowControls)
  31. {
  32. using (GraphicsPath gp = new GraphicsPath())
  33. {
  34. gp.AddRectangle(new Rectangle(control.Location.X, control.Location.Y, control.Size.Width, control.Size.Height));
  35. DrawShadowSmooth(gp, 100, 60, shadowBmp);
  36. }
  37. e.Graphics.DrawImage(shadowBmp, new Point(0, 0));
  38. }
  39. }
  40. private static void DrawShadowSmooth(GraphicsPath gp, int intensity, int radius, Bitmap dest)
  41. {
  42. using (Graphics g = Graphics.FromImage(dest))
  43. {
  44. g.Clear(Color.Transparent);
  45. g.CompositingMode = CompositingMode.SourceCopy;
  46. double alpha = 0;
  47. double astep = 0;
  48. double astepstep = (double)intensity / radius / (radius / 2D);
  49. for (int thickness = radius; thickness > 0; thickness--)
  50. {
  51. using (Pen p = new Pen(Color.FromArgb((int)alpha, 0, 0, 0), thickness))
  52. {
  53. p.LineJoin = LineJoin.Round;
  54. g.DrawPath(p, gp);
  55. }
  56. alpha += astep;
  57. astep += astepstep;
  58. }
  59. }
  60. }

 

对于可移动控件(任何控件),请参阅以下代码项目文章。该类还允许记住/恢复位置。我没有提到实际的面板,因为它是我没有的 DevExpress 第三方库,但应该可以正常工作。

示例用法


  1. ControlMoverOrResizer.Init(shadowPanel1);
友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内劳动服务器公司办公楼一层