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();
}
}
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
5条答案
按热度按时间2exbekwf1#
在WinForms中,您可以覆盖表单的受保护的
CreateParams
属性,并将CS_DROPSHADOW
标志添加到类样式中。举例来说:但是,有几个警告...
1.此标志仅在顶级窗口上起作用。在Win32中,这意味着重叠和弹出窗口。它对子窗口没有影响(例如,我想我记得在什么地方听说过这个限制已经从Windows 8中删除了,但是我找不到确认这个的链接,而且我没有安装Windows 8用于测试目的。
1.用户可能已完全禁用此功能。如果是这样的话,你不会得到投影,无论你如何要求他们。这是设计好的您的应用程序不应尝试覆盖此请求。您可以通过对
SystemParametersInfo
函数执行P/S命令并传递SPI_GETDROPSHADOW
标志来确定是否启用或禁用投影。CS_DROPSHADOW
是独立且不同的,并且 * 仅 * 在启用Aero时有效。没有办法关闭和打开它的个别窗口。此外,由于Aero主题已从Windows 8中删除,因此它将永远不会有这些阴影。hl0ma9xz2#
这是我的C#实现。这与Al相似。但是你会注意到当你失去焦点和重新获得焦点时,阴影会重新绘制自己。
我还添加了允许鼠标拖动的代码。
m1m5dgzv3#
嗯,,,只是过去的代码,你会得到windows 7像这样的阴影>>> http://marcin.floryan.pl/wp-content/uploads/2010/08/WPF-Window-native-shadow.png
ztigrdn84#
我已经在这里回答了:无边界窗体上的阴影-没有 Flink 或消失
我的答案是:
请尝试以下步骤,并恢复任何错误:
将下面的代码添加到名为DropShadow.cs的新代码文件中;
在您的表单中,将此行添加到InitializeComponent()下面;
不过,我还是建议切换到WPF。我自己是WinForms的用户很长一段时间了,但是WPF在设计用户界面方面提供了更好的灵活性。您还可以自定义所有控件,而不需要任何框架或包。学习WPF确实需要一些时间,但这是值得的。
biswetbf5#
据我所知,在WinForms中没有直接的方法来做到这一点。
相反,你可以按照这个步骤一步一步来:
1)使用photoshop或任何其他工具创建一个具有所需投影的图像。
2)将此图像用作窗体的背景图像。
3)将窗体的FormBorderStyle属性设置为None。
4)你完了!
5)注意:请确保保存图像在适当的格式(如PNG),使投影效果可以工作。