1.win32 api
public class BoxShadow
{
public const int CS_DROPSHADOW = 0x00020000;//可用背影框
public const int WM_NCPAINT = 0x0085;//绘制
public const int WM_NCHITTEST = 0x84;// 可以拖拽窗体
public const int HTCLIENT = 0x1;//窗体
public const int HTCAPTION = 0x2;//窗体标题栏
[DllImport("dwmapi.dll")]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
/// <summary>
/// 设置窗体属性
/// </summary>
/// <param name="hwnd"></param>
/// <param name="attr"></param>
/// <param name="attrValue"></param>
/// <param name="attrSize"></param>
/// <returns></returns>
[DllImport("dwmapi.dll")]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
/// <summary>
/// 复合窗体是否可用
/// </summary>
/// <param name="pfEnabled"></param>
/// <returns></returns>
[DllImport("dwmapi.dll")]
public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
public struct MARGINS // 背影框 struct
{
public int leftWidth;
public int rightWidth;
public int topHeight;
public int bottomHeight;
}
}
2.自定义窗体
//是否启用Aero
private bool _mAeroEnabled;
public virtual bool UserBoxShadow { get; set; }
protected override CreateParams CreateParams
{
get
{
if (UserBoxShadow)
{
_mAeroEnabled = CheckAeroEnabled();
var cp = base.CreateParams;
if (!_mAeroEnabled)
cp.ClassStyle |= BoxShadow.CS_DROPSHADOW;
return cp;
}
return base.CreateParams;
}
}
protected override void WndProc(ref Message m)
{
if (UserBoxShadow)
{
switch (m.Msg)
{
case BoxShadow.WM_NCPAINT: // box shadow
if (_mAeroEnabled)
{
var v = 2;
BoxShadow.DwmSetWindowAttribute(Handle, 2, ref v, 4);
var margins = new BoxShadow.MARGINS
{
bottomHeight = 1,
leftWidth = 1,
rightWidth = 1,
topHeight = 1
};
BoxShadow.DwmExtendFrameIntoClientArea(Handle, ref margins);
}
break;
}
}
base.WndProc(ref m);
}
private bool CheckAeroEnabled()
{
if (Environment.OSVersion.Version.Major >= 6)
{
int enabled = 0;
BoxShadow.DwmIsCompositionEnabled(ref enabled);
return enabled == 1;
}
return false;
}