我在 C# 中工作。""
我知道这个问题很常见,只是当我将表单文本字符串设置为and时,我仍然无法完全隐藏顶部栏controlbox = false
。
我仍然想要阴影效果:
侧面的边框消失了,并且有通常的阴影,但顶部边框有一条奇怪的白线,我删除了。
右上角的按钮由我生成,显示我的可编辑表单的边缘。上面的空白是我要删除的。
我不想将表单边框属性设置为,none
因为我喜欢集成的可缩放控件和表单阴影,所以这不是一个选项。
对此还有其他建议吗?
我在 C# 中工作。""
我知道这个问题很常见,只是当我将表单文本字符串设置为and时,我仍然无法完全隐藏顶部栏controlbox = false
。
我仍然想要阴影效果:
侧面的边框消失了,并且有通常的阴影,但顶部边框有一条奇怪的白线,我删除了。
右上角的按钮由我生成,显示我的可编辑表单的边缘。上面的空白是我要删除的。
我不想将表单边框属性设置为,none
因为我喜欢集成的可缩放控件和表单阴影,所以这不是一个选项。
对此还有其他建议吗?
如果您只是不设置FormBorderStyle
阴影None
,我已经回答了如何在“无边框 Winform 上的阴影-无闪烁或消失”中轻松制作阴影。这是我的答案:
如果您有任何错误,请尝试以下步骤并恢复:
将此代码添加到名为 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
}
}
在您的表单中,在下面添加此行InitializeComponent()
:
(new Core.DropShadow()).ApplyShadows(this);
我知道这篇文章很旧,但我偶然发现了这个问题并最终解决了它,所以我将它发布在这里以供任何可以提供帮助的人使用。
因此,我使用自己的控制栏和按钮制作了一个自定义可调整大小的无边框 Form 类,类似于 OP。想法是让该表单以及所有相关WndProc
代码充当项目中所有其他对话框表单的基类。
当我运行我的项目时,我在表单顶部得到了完全相同的白线,即使我已经正确设置了所有适当的表单属性。
问题最终是通过 Form 继承,所有派生的 Forms 也有自己的私有InitializeComponent
方法。我不知道 VS IDESizable
在派生的 Form 类中设置了 FormBorderStyle 属性,因为我只关注自定义基类。
如果您使用自定义基类,则在派生类中正确Form
设置可以解决问题。FormBorderStyle
如果单击表单,请转到 FormBorderSyle 的属性并将其放入False
.