picture c# vb.net winforms dropshadow

c# picture box shadow



Sombra en un WinForm sin bordes (4)

Aquí está mi implementación de C # Es similar a la de Al.Pertro, pero notará que cuando pierde el enfoque y recupera el enfoque, la sombra se vuelve a pintar.

También he añadido código para permitir arrastrar el ratón.

public partial class Form1 : Form { [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] private static extern IntPtr CreateRoundRectRgn ( int nLeftRect, // x-coordinate of upper-left corner int nTopRect, // y-coordinate of upper-left corner int nRightRect, // x-coordinate of lower-right corner int nBottomRect, // y-coordinate of lower-right corner int nWidthEllipse, // height of ellipse int nHeightEllipse // width of ellipse ); [DllImport("dwmapi.dll")] public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset); [DllImport("dwmapi.dll")] public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); [DllImport("dwmapi.dll")] public static extern int DwmIsCompositionEnabled(ref int pfEnabled); private bool m_aeroEnabled; // variables for box shadow private const int CS_DROPSHADOW = 0x00020000; private const int WM_NCPAINT = 0x0085; private const int WM_ACTIVATEAPP = 0x001C; public struct MARGINS // struct for box shadow { public int leftWidth; public int rightWidth; public int topHeight; public int bottomHeight; } private const int WM_NCHITTEST = 0x84; // variables for dragging the form private const int HTCLIENT = 0x1; private const int HTCAPTION = 0x2; protected override CreateParams CreateParams { get { m_aeroEnabled = CheckAeroEnabled(); CreateParams cp = base.CreateParams; if (!m_aeroEnabled) cp.ClassStyle |= CS_DROPSHADOW; return cp; } } private bool CheckAeroEnabled() { if (Environment.OSVersion.Version.Major >= 6) { int enabled = 0; DwmIsCompositionEnabled(ref enabled); return (enabled == 1) ? true : false; } return false; } protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_NCPAINT: // box shadow if (m_aeroEnabled) { var v = 2; DwmSetWindowAttribute(this.Handle, 2, ref v, 4); MARGINS margins = new MARGINS() { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; DwmExtendFrameIntoClientArea(this.Handle, ref margins); } break; default: break; } base.WndProc(ref m); if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) // drag the form m.Result = (IntPtr)HTCAPTION; } public Form1() { m_aeroEnabled = false; this.FormBorderStyle = FormBorderStyle.None; InitializeComponent(); } }

Estoy tratando de dejar una sombra alrededor de todo el formulario como en la primera imagen, excepto que es un WPF no un WinForm. ahora quiero soltar la misma sombra en una forma de victoria.

Esto es lo que quiero ...

No esto ...


Humm…, acaba de pasar el código y obtendrás Windows 7 Drop Shadow como este >>> http://marcin.floryan.pl/wp-content/uploads/2010/08/WPF-Window-native-shadow.png

Imports System.Runtime.InteropServices Public Class IMSS_SplashScreen Private aeroEnabled As Boolean Protected Overrides ReadOnly Property CreateParams() As CreateParams Get CheckAeroEnabled() Dim cp As CreateParams = MyBase.CreateParams If Not aeroEnabled Then cp.ClassStyle = cp.ClassStyle Or NativeConstants.CS_DROPSHADOW Return cp Else Return cp End If End Get End Property Protected Overrides Sub WndProc(ByRef m As Message) Select Case m.Msg Case NativeConstants.WM_NCPAINT Dim val = 2 If aeroEnabled Then NativeMethods.DwmSetWindowAttribute(Handle, 2, val, 4) Dim bla As New NativeStructs.MARGINS() With bla .bottomHeight = 1 .leftWidth = 1 .rightWidth = 1 .topHeight = 1 End With NativeMethods.DwmExtendFrameIntoClientArea(Handle, bla) End If Exit Select End Select MyBase.WndProc(m) End Sub Private Sub CheckAeroEnabled() If Environment.OSVersion.Version.Major >= 6 Then Dim enabled As Integer = 0 Dim response As Integer = NativeMethods.DwmIsCompositionEnabled(enabled) aeroEnabled = (enabled = 1) Else aeroEnabled = False End If End Sub End Class Public Class NativeStructs Public Structure MARGINS Public leftWidth As Integer Public rightWidth As Integer Public topHeight As Integer Public bottomHeight As Integer End Structure End Class Public Class NativeMethods <DllImport("dwmapi")> _ Public Shared Function DwmExtendFrameIntoClientArea(ByVal hWnd As IntPtr, ByRef pMarInset As NativeStructs.MARGINS) As Integer End Function <DllImport("dwmapi")> _ Friend Shared Function DwmSetWindowAttribute(ByVal hwnd As IntPtr, ByVal attr As Integer, ByRef attrValue As Integer, ByVal attrSize As Integer) As Integer End Function <DllImport("dwmapi.dll")> _ Public Shared Function DwmIsCompositionEnabled(ByRef pfEnabled As Integer) As Integer End Function End Class Public Class NativeConstants Public Const CS_DROPSHADOW As Integer = &H20000 Public Const WM_NCPAINT As Integer = &H85 End Class


Que yo sepa, no hay forma directa de hacerlo en WinForms.

En su lugar, puede seguir este paso a paso:

1) Cree una imagen con la sombra deseada con photoshop o cualquier otra herramienta.
2) Utilice esta imagen como imagen de fondo de su formulario.
3) Establezca la propiedad FormBorderStyle del formulario en Ninguno.
4) ¡Ya terminaste!
5) Nota: Asegúrese de guardar la imagen en el formato adecuado (como png) para que el efecto de sombra paralela pueda funcionar.


En WinForms, puede anular la propiedad protegida CreateParams del CreateParams y agregar el indicador CS_DROPSHADOW a los estilos de clase. Por ejemplo:

public class ShadowedForm : Form { protected override CreateParams CreateParams { get { const int CS_DROPSHADOW = 0x20000; CreateParams cp = base.CreateParams; cp.ClassStyle |= CS_DROPSHADOW; return cp; } } // ... other code ... }

Pero, un par de advertencias ...

  1. Esta bandera sólo funciona en las ventanas de nivel superior. En Win32-speak, eso significa ventanas superpuestas y ventanas emergentes. No tiene efecto en ventanas secundarias (por ejemplo, controles). Pensé que recordaba haber escuchado en alguna parte que esta limitación se había eliminado de Windows 8, pero no puedo encontrar un enlace que confirme esto y no tengo Windows 8 instalado para realizar pruebas.

  2. Es posible que el usuario haya deshabilitado esta función por completo. Si es así, no obtendrás sombras, no importa cómo las solicites. Eso es por diseño. Su solicitud no debe intentar anular esta solicitud. Puede determinar si las sombras están activadas o desactivadas mediante P / Invocar la función SystemParametersInfo y pasando el indicador SPI_GETDROPSHADOW .

  3. El tema Aero también agrega sombras a las ventanas de nivel superior. Este efecto es separado y distinto de CS_DROPSHADOW , y funciona solo cuando Aero está habilitado. No hay manera de apagarlo y encenderlo para ventanas individuales. Además, dado que el tema Aero se ha eliminado de Windows 8, nunca tendrá estas sombras.