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 ...
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.
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 indicadorSPI_GETDROPSHADOW
.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.