| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- using Azylee.WinformSkin.APIUtils;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace Azylee.WinformSkin.FormUI.SimpleShadow
- {
- partial class SimpleShadowBackForm : Form
- {
- #region 属性
- private Point _MouseLocation;
- internal Point MouseLocation { get { return _MouseLocation; } }
- private SimpleShadowForm Main;
- #endregion
- public SimpleShadowBackForm(SimpleShadowForm main)
- {
- InitializeComponent();
- SetStyles();//减少闪烁
- Main = main;//获取控件层对象
- Text = main.Text;//设置标题栏文本
- Icon = main.Icon;//设置图标
- TopMost = main.TopMost;
- FormBorderStyle = FormBorderStyle.None;//设置无边框的窗口样式
- ShowInTaskbar = true;//显示阴影层到任务栏(win10可显示缩略图)
- Size = Main.Size;//统一大小
- Width += (Main.ShadowWidth * 2);
- Height += (Main.ShadowWidth * 2);
- Main.Owner = this;//设置控件层的拥有皮肤层
- DrawShadow();
- //SetBits();//绘制半透明不规则皮肤
- }
- private void SimpleShadowBackForm_Load(object sender, EventArgs e)
- {
- }
- #region 减少闪烁
- private void SetStyles()
- {
- SetStyle(
- ControlStyles.UserPaint |
- ControlStyles.AllPaintingInWmPaint |
- ControlStyles.OptimizedDoubleBuffer |
- ControlStyles.ResizeRedraw |
- ControlStyles.DoubleBuffer, true);
- //强制分配样式重新应用到控件上
- UpdateStyles();
- base.AutoScaleMode = AutoScaleMode.None;
- }
- #endregion
- #region 绘图
- protected override CreateParams CreateParams
- {
- get
- {
- CreateParams cParms = base.CreateParams;
- cParms.ExStyle |= 0x00080000; // WS_EX_LAYERED
- return cParms;
- }
- }
- internal void DrawShadow()
- {
- Bitmap bitmap = null;
- Graphics g = null;
- try
- {
- bitmap = new Bitmap(Width, Height);
- g = Graphics.FromImage(bitmap);
- g.SmoothingMode = SmoothingMode.AntiAlias;
- Color c = Color.FromArgb(0, 0, 0, 0);
- Pen p = new Pen(c, 3);
- for (int i = 0; i < Main.ShadowWidth; i++)
- {
- p.Color = Color.FromArgb((255 / 10 / Main.ShadowWidth) * i, c);
- DrawRoundRectangle(g, p, new Rectangle(i, i, Width - (2 * i) - 1, Height - (2 * i) - 1), Main.ShadowWidth - i);
- }
- SetBits(bitmap);
- }
- catch { }
- finally
- {
- g?.Dispose();
- bitmap?.Dispose();
- }
- }
- public void SetBits(Bitmap bitmap)
- {
- if (!Image.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Image.IsAlphaPixelFormat(bitmap.PixelFormat))
- throw new ApplicationException("图片必须是32位带Alhpa通道的图片。");
- IntPtr oldBits = IntPtr.Zero;
- IntPtr screenDC = FormStyleAPI.GetDC(IntPtr.Zero);
- IntPtr hBitmap = IntPtr.Zero;
- IntPtr memDc = FormStyleAPI.CreateCompatibleDC(screenDC);
- try
- {
- FormStyleAPI.Point topLoc = new FormStyleAPI.Point(Left, Top);
- FormStyleAPI.Size bitMapSize = new FormStyleAPI.Size(Width, Height);
- FormStyleAPI.BLENDFUNCTION blendFunc = new FormStyleAPI.BLENDFUNCTION();
- FormStyleAPI.Point srcLoc = new FormStyleAPI.Point(0, 0);
- hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
- oldBits = FormStyleAPI.SelectObject(memDc, hBitmap);
- blendFunc.BlendOp = FormStyleAPI.AC_SRC_OVER;
- blendFunc.SourceConstantAlpha = Byte.Parse(((int)(Main.Opacity * 255)).ToString());
- blendFunc.AlphaFormat = FormStyleAPI.AC_SRC_ALPHA;
- blendFunc.BlendFlags = 0;
- FormStyleAPI.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc, 0, ref blendFunc, FormStyleAPI.ULW_ALPHA);
- }
- finally
- {
- if (hBitmap != IntPtr.Zero)
- {
- FormStyleAPI.SelectObject(memDc, oldBits);
- FormStyleAPI.DeleteObject(hBitmap);
- }
- FormStyleAPI.ReleaseDC(IntPtr.Zero, screenDC);
- FormStyleAPI.DeleteDC(memDc);
- }
- }
- #endregion
- #region MyRegion
- public static void DrawRoundRectangle(Graphics g, Pen pen, Rectangle rect, int cornerRadius)
- {
- using (GraphicsPath path = CreateRoundedRectanglePath(rect, cornerRadius))
- {
- g.DrawPath(pen, path);
- }
- }
- public static void FillRoundRectangle(Graphics g, Brush brush, Rectangle rect, int cornerRadius)
- {
- using (GraphicsPath path = CreateRoundedRectanglePath(rect, cornerRadius))
- {
- g.FillPath(brush, path);
- }
- }
- internal static GraphicsPath CreateRoundedRectanglePath(Rectangle rect, int cornerRadius)
- {
- GraphicsPath roundedRect = new GraphicsPath();
- roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
- roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);
- roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);
- roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);
- roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);
- roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom);
- roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
- roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);
- roundedRect.CloseFigure();
- return roundedRect;
- }
- #endregion
- }
- }
|