versión corta:de Windows Dropshadow 7 estilo en forma sin bordes
Objetivo: A, oscuro, Windows 7 dropshadow profundamente en WinForm sin bordes en C#
Soluciones existentes conocidas 1: Sencilla sombra de estilo XP usando CreateParams.
Problema: A débil, a la luz, a feo.
soluciones existentes conocidos 2: Reemplazar GDI de forma con mapa de bits.
Problema: Pierde la capacidad de usar controles, solo funciona como pantalla de bienvenida.
objetivo de este post: encontrar una solución a este problema mediana o un todos juntos mejor.
. . .
Versión larga:
(Editar:. Me refiero a la sombra base que va a lo largo de la frontera de cualquier forma de ventanas, si eso no era clara) entiendo que hay una manera de hacer DropShadows estilo XP en C# usando:
código C# 1 - simple de estilo XP dropshadow (Problema: a la luz, al débil, al feo)
// Define the CS_DROPSHADOW constant
private const int CS_DROPSHADOW = 0x00020000;
// Override the CreateParams property
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ClassStyle |= CS_DROPSHADOW;
return cp;
}
}
Sin embargo, estoy tratando de descubrir cómo hacer que se vean como el hacer en Windows 7 (sombras más grandes y más grandes) y no puedo encontrar la mejor manera de hacerlo.
tengo un método crea ahora que me permita invalidar todo el formulario de GDI y aparecen como una pantalla de bienvenida haría (crédito no la mía):
código C# 2: Reemplazar forma GDI con el mapa de bits (Problema: ¿ 't utilizar los controles de formulario, difícil de mantener GUI)
public void SetBitmap(Bitmap bitmap, byte opacity)
{
if (bitmap.PixelFormat != PixelFormat.Format32bppArgb)
throw new ApplicationException("The bitmap must be 32ppp with alpha-channel.");
// 1. Create a compatible DC with screen;
// 2. Select the bitmap with 32bpp with alpha-channel in the compatible DC;
// 3. Call the UpdateLayeredWindow.
IntPtr screenDc = Win32.GetDC(IntPtr.Zero);
IntPtr memDc = Win32.CreateCompatibleDC(screenDc);
IntPtr hBitmap = IntPtr.Zero;
IntPtr oldBitmap = IntPtr.Zero;
try
{
hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); // grab a GDI handle from this GDI+ bitmap
oldBitmap = Win32.SelectObject(memDc, hBitmap);
Win32.Size size = new Win32.Size(bitmap.Width, bitmap.Height);
Win32.Point pointSource = new Win32.Point(0, 0);
Win32.Point topPos = new Win32.Point(Left, Top);
Win32.BLENDFUNCTION blend = new Win32.BLENDFUNCTION();
blend.BlendOp = Win32.AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = opacity;
blend.AlphaFormat = Win32.AC_SRC_ALPHA;
Win32.UpdateLayeredWindow(this.Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, Win32.ULW_ALPHA);
}
finally
{
Win32.ReleaseDC(IntPtr.Zero, screenDc);
if (hBitmap != IntPtr.Zero)
{
Win32.SelectObject(memDc, oldBitmap);
Win32.DeleteObject(hBitmap);
}
Win32.DeleteDC(memDc);
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00080000; // This form has to have the WS_EX_LAYERED extended style
return cp;
}
}
sin embargo, esto me da un fondo completo de 32 bits (como yo requiero para añadir el dropshadow manualmente), pero pierden la capacidad de crear la forma elementos que son visibles.
Básicamente, estoy tratando de encontrar una mediana entre estos dos métodos. Algo que me dará sombras profundas y oscuras sin perder otras funcionalidades/causando requisitos excesivos de repintado.
¿Cuál es exactamente tu pregunta? Realmente este no es el lugar para obtener la solución escrita para usted. –
@Ramhound La pregunta es simple. Estoy buscando apuntar en la dirección correcta en esto. Mi pregunta está bien investigada y tan clara como pude. Solo quiero saber si alguien sabe de una mejor manera de crear una sombra de gotas estilo Windows 7. – Corylulu
¿Puedes agregar una captura de pantalla o una maqueta del resultado deseado? –