Cómo agregar sombra a todos los bordes en formato C#
El método que uso es dibujar la sombra en el mapa de bits y luego dibujar el mapa de bits en la capa de fondo usando el principio de una forma de doble capa.
Los más importantes son:
1. Dibujar un rectángulo circular
public static void DrawRoundRectangle(Gráficos g, Pen pen, Rectángulo rect, int cornerRadius)
{
Uso (ruta GraphicsPath = CreateRoundedRectanglePath(rect, cornerRadius))
{
g.DrawPath(pluma, ruta) ;
}
}}
public static void FillRoundRectangle(Gráficos g, Pincel, Rectángulo rect, int cornerRadius)
{
usando (ruta GraphicsPath = CreateRoundedRectanglePath(rect, cornerRadius))
{
g.FillPath(pincel, ruta);
}
}
GraphicsPath estático interno CreateRoundedRectanglePath(Rectangle rect, int cornerRadius)
{
GraphicsPath roundedRect = new GraphicsPath();
redondeadoRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
redondeadoRect.Agregar línea recta (rect.X + cornerRadius , rect.right - cornerRadius * 2, rect.Y);
roundedRect.AddArc (rect.X + rect.Width - cornerRadius * 2, rect.270, 90); > roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);
roundedRect.AddArc(rect.X + rect Ancho - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2);
Rectángulo redondeado.
Altura (altura) - 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.AddArc(rect..Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.CloseFigure();
return roundedRect;}
2. Dibujar sombra
Nulo interno DrawShadow()
{
Mapa de bits mapa de bits = nulo;
Gráficos g = nulo
{
mapa de bits = nuevo mapa de bits(Ancho, Alto);
g = Gráficos.
g.SmoothingMode = SmoothingMode.AntiAlias;
Color c = Color.FromArgb(0, 0, 0, 0);
Pen p = new Pen(c, 3) for (int i = 0; i & lt; Main.ShadowWidth - i) ;
}
SetBits(mapa de bits);
} catch { } finalmente
{
Esto es la primera vez que se ha dibujado el mapa de bits p>g?.Dispose();
bitmap?Dispose();
}
} p> p>
3. Dibuje un mapa de bits translúcido en la ventana
anulación protegida CreateParams CreateParams
{
SetBits(bitmap);
{
SetBits(mapa de bits);
{
Captura { } finalmente
{
obtener
{
CreateParams cParms = base.CreateParams
{
CreateParams cParms = base.CreateParams
;{
CreateParams cParms = base.CreateParamsCreateParams;
cParms.ExStyle |= 0x00080000; // WS_EX_LAYERED
devuelve cParms;
}
}
SetBits públicos vacíos (mapa de bits mapa de bits)
{
If (!Image.IsCanicalPixelFormat(mapa de bits.PixelFormat ) || !Soy
ge.IsAlphaPixelFormat(bitmap.PixelFormat))
{
If (!Image.IsCanicalPixelFormat(bitmap.PixelFormat) || !Image.IsAlphaPixelFormat(bitmap.PixelFormat))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_OVER;