10

我在 C# 中工作。""我知道这个问题很常见,只是当我将表单文本字符串设置为and时,我仍然无法完全隐藏顶部栏controlbox = false

我仍然想要阴影效果:

阴影效果

侧面的边框消失了,并且有通常的阴影,但顶部边框有一条奇怪的白线,我删除了。

右上角的按钮由我生成,显示我的可编辑表单的边缘。上面的空白是我要删除的。

我不想将表单边框属性设置为,none因为我喜欢集成的可缩放控件和表单阴影,所以这不是一个选项。

对此还有其他建议吗?

4

3 回答 3

0

如果您只是不设置FormBorderStyle阴影None,我已经回答了如何在“无边框 Winform 上的阴影-无闪烁或消失”中轻松制作阴影。这是我的答案:

如果您有任何错误,请尝试以下步骤并恢复:

  1. 将此代码添加到名为 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
         }
     }
    
  2. 在您的表单中,在下面添加此行InitializeComponent()

     (new Core.DropShadow()).ApplyShadows(this);
    
于 2020-04-01T08:38:08.763 回答
0

我知道这篇文章很旧,但我偶然发现了这个问题并最终解决了它,所以我将它发布在这里以供任何可以提供帮助的人使用。

因此,我使用自己的控制栏和按钮制作了一个自定义可调整大小的无边框 Form 类,类似于 OP。想法是让该表单以及所有相关WndProc代码充当项目中所有其他对话框表单的基类。

当我运行我的项目时,我在表单顶部得到了完全相同的白线,即使我已经正确设置了所有适当的表单属性。

问题最终是通过 Form 继承,所有派生的 Forms 也有自己的私有InitializeComponent方法。我不知道 VS IDESizable在派生的 Form 类中设置了 FormBorderStyle 属性,因为我只关注自定义基类。

如果您使用自定义基类,则在派生类中正确Form设置可以解决问题。FormBorderStyle

于 2019-10-02T02:45:36.547 回答
0

如果单击表单,请转到 FormBorderSyle 的属性并将其放入False.

于 2019-10-03T22:11:25.543 回答