C# 无边界winform阴影
我有一个无边框的windows窗体,我使用下面的代码在它后面创建了一个阴影。 但是,当我点击父窗体时,阴影消失了 有谁能帮助我,即使在点击其他表单/父表单时,如何保持阴影? 例如,shaddow可以在不同的窗口chrome上看到,但不能在其父窗体上看到 我试过谷歌,但什么也找不到 更新 我注意到,如果我最小化窗口并再次将其最大化,阴影确实会回来 我的代码C# 无边界winform阴影,c#,winforms,C#,Winforms,我有一个无边框的windows窗体,我使用下面的代码在它后面创建了一个阴影。 但是,当我点击父窗体时,阴影消失了 有谁能帮助我,即使在点击其他表单/父表单时,如何保持阴影? 例如,shaddow可以在不同的窗口chrome上看到,但不能在其父窗体上看到 我试过谷歌,但什么也找不到 更新 我注意到,如果我最小化窗口并再次将其最大化,阴影确实会回来 我的代码 提前感谢请尝试以下步骤,并返回任何错误: 将以下代码添加到名为DropShadow.cs的新代码文件中 using System; using
提前感谢请尝试以下步骤,并返回任何错误: 将以下代码添加到名为DropShadow.cs的新代码文件中
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Core
{
public class DropShadow
{
#region Shadowing
#region Fields
private bool _isAeroEnabled = false;
private bool _isDraggingEnabled = false;
private const int WM_NCHITTEST = 0x84;
private const int WS_MINIMIZEBOX = 0x20000;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
private const int CS_DBLCLKS = 0x8;
private const int CS_DROPSHADOW = 0x00020000;
private const int WM_NCPAINT = 0x0085;
private const int WM_ACTIVATEAPP = 0x001C;
#endregion
#region Structures
[EditorBrowsable(EditorBrowsableState.Never)]
public struct MARGINS
{
public int leftWidth;
public int rightWidth;
public int topHeight;
public int bottomHeight;
}
#endregion
#region Methods
#region Public
[DllImport("dwmapi.dll")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
[DllImport("dwmapi.dll")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
[EditorBrowsable(EditorBrowsableState.Never)]
public static bool IsCompositionEnabled()
{
if (Environment.OSVersion.Version.Major < 6) return false;
bool enabled;
DwmIsCompositionEnabled(out enabled);
return enabled;
}
#endregion
#region Private
[DllImport("dwmapi.dll")]
private static extern int DwmIsCompositionEnabled(out bool enabled);
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect,
int nWidthEllipse,
int nHeightEllipse
);
private bool CheckIfAeroIsEnabled()
{
if (Environment.OSVersion.Version.Major >= 6)
{
int enabled = 0;
DwmIsCompositionEnabled(ref enabled);
return (enabled == 1) ? true : false;
}
return false;
}
#endregion
#region Overrides
public void ApplyShadows(Form form)
{
var v = 2;
DwmSetWindowAttribute(form.Handle, 2, ref v, 4);
MARGINS margins = new MARGINS()
{
bottomHeight = 1,
leftWidth = 0,
rightWidth = 0,
topHeight = 0
};
DwmExtendFrameIntoClientArea(form.Handle, ref margins);
}
#endregion
#endregion
#endregion
}
}
请尝试以下步骤,并返回任何错误: 将以下代码添加到名为DropShadow.cs的新代码文件中
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Core
{
public class DropShadow
{
#region Shadowing
#region Fields
private bool _isAeroEnabled = false;
private bool _isDraggingEnabled = false;
private const int WM_NCHITTEST = 0x84;
private const int WS_MINIMIZEBOX = 0x20000;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
private const int CS_DBLCLKS = 0x8;
private const int CS_DROPSHADOW = 0x00020000;
private const int WM_NCPAINT = 0x0085;
private const int WM_ACTIVATEAPP = 0x001C;
#endregion
#region Structures
[EditorBrowsable(EditorBrowsableState.Never)]
public struct MARGINS
{
public int leftWidth;
public int rightWidth;
public int topHeight;
public int bottomHeight;
}
#endregion
#region Methods
#region Public
[DllImport("dwmapi.dll")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
[DllImport("dwmapi.dll")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
[EditorBrowsable(EditorBrowsableState.Never)]
public static bool IsCompositionEnabled()
{
if (Environment.OSVersion.Version.Major < 6) return false;
bool enabled;
DwmIsCompositionEnabled(out enabled);
return enabled;
}
#endregion
#region Private
[DllImport("dwmapi.dll")]
private static extern int DwmIsCompositionEnabled(out bool enabled);
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect,
int nWidthEllipse,
int nHeightEllipse
);
private bool CheckIfAeroIsEnabled()
{
if (Environment.OSVersion.Version.Major >= 6)
{
int enabled = 0;
DwmIsCompositionEnabled(ref enabled);
return (enabled == 1) ? true : false;
}
return false;
}
#endregion
#region Overrides
public void ApplyShadows(Form form)
{
var v = 2;
DwmSetWindowAttribute(form.Handle, 2, ref v, 4);
MARGINS margins = new MARGINS()
{
bottomHeight = 1,
leftWidth = 0,
rightWidth = 0,
topHeight = 0
};
DwmExtendFrameIntoClientArea(form.Handle, ref margins);
}
#endregion
#endregion
#endregion
}
}
在特定情况下,当可见性发生变化时,会对类进行安全性检查,从而重新应用类样式。您可以重写它,自己重新设置类样式。重写OnActivated,从CreateParams获取当前样式,调用base,然后调用:CreateParams cp=this.CreateParams;碱基活性肽;SetClassLongPtrthis.Handle,GCL_样式,IntPtrcp.ClassStyle | CS|u DROPSHADOW;此.Invalidatefalse;。这将在最小化窗体后还原窗体时,将CS_DROPSHADOW样式重新应用于该类。如果这是你指的。从描述上看不太清楚。还有其他方法,但看看这是否适用。谢谢,如果你能再多解释一点,我会很感激,我的C技能最多只是中级,我觉得这将进入一个完全不同的世界,我真的不知道当可见性发生变化时,在特定情况下,会对类进行安全检查,这将重新应用类样式。您可以重写它,自己重新设置类样式。重写OnActivated,从CreateParams获取当前样式,调用base,然后调用:CreateParams cp=this.CreateParams;碱基活性肽;SetClassLongPtrthis.Handle,GCL_样式,IntPtrcp.ClassStyle | CS|u DROPSHADOW;此.Invalidatefalse;。这将在最小化窗体后还原窗体时,将CS_DROPSHADOW样式重新应用于该类。如果这是你指的。从描述上看不太清楚。还有其他的方法,但看看这是否适用。谢谢,如果你能再解释一点,我会很感激,我的C语言技能最多只是中级水平,我觉得这将进入一个完全不同的世界,我真的不知道你是天才,我整天都在寻找这个。我不完全理解DropShadow类中发生了什么,但它正在工作。这是你的密码吗?或者你能指出一个有解释的地方吗?有一件小事,底部有一个很小的白色条纹,我的身体喘息着,所以它是可见的,有什么办法可以让它痛苦吗?@利润者:在代码中寻找“底部高度”。只需设置bottomHeight=0,而不是bottomHeight=1,它应该可以工作。我假设可以,但当我尝试完全移除阴影时,我只是尝试将条带移动到顶部,它看起来更适合我的特定应用,所以这对我来说很有效。再次非常感谢@男:很好,问题已经解决了。但是,如果将来遇到此问题,可以添加面板,而不是直接绘制窗体。你可以在面板上添加控件。你是个天才,我已经找了一整天了。我不完全理解DropShadow类中发生了什么,但它正在工作。这是你的密码吗?或者你能指出一个有解释的地方吗?有一件小事,底部有一个很小的白色条纹,我的身体喘息着,所以它是可见的,有什么办法可以让它痛苦吗?@利润者:在代码中寻找“底部高度”。只需设置bottomHeight=0,而不是bottomHeight=1,它应该可以工作。我假设可以,但当我尝试完全移除阴影时,我只是尝试将条带移动到顶部,它看起来更适合我的特定应用,所以这对我来说很有效。再次非常感谢@男:很好,问题已经解决了。但是,如果将来遇到此问题,可以添加面板,而不是直接绘制窗体。可以将控件添加到面板中。
(new Core.DropShadow()).ApplyShadows(this);