Не удается полностью скрыть верхнюю панель в форме Windows C#
Я работаю в C#. Я знаю, что этот вопрос часто задают, просто я все еще не могу полностью скрыть верхнюю панель. Это результат, который я получаю, когда задаю текстовую строку формы равной "" и controlbox = false
,
Все еще хочу эффект тени:
Итак, как вы можете видеть, граница на стороне исчезла (отлично!), И есть обычная тень (отлично!), Но верхняя граница имеет эту странную белую линию, которую я не могу удалить.
Я не хочу устанавливать для свойства границы формы значение "none", так как мне нравятся встроенные элементы управления размерами и тень формы, так что это не вариант. Любые другие предложения для этого?
Заранее спасибо!
(Я должен указать, что кнопки в правом верхнем углу сгенерированы мной и показывают край моей редактируемой формы. Пустое пространство над этим - то, что я пытаюсь удалить.)
2 ответа
У меня была такая же проблема на Windows 10
public const int WM_NCCALCSIZE = 0x0083;
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
Содержит информацию, которую приложение может использовать при обработке сообщения WM_NCCALCSIZE для вычисления размера, положения и допустимого содержимого клиентской области окна.
struct NCCALCSIZE_PARAMS
{
public RECT rgrc0, rgrc1, rgrc2;
public IntPtr lppos;
}
Отправляется, когда необходимо вычислить размер и положение клиентской области окна. Обрабатывая это сообщение, приложение может контролировать содержимое клиентской области окна при изменении размера или положения окна.
Окно получает это сообщение через функцию WindowProc.
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCCALCSIZE:
{
NCCALCSIZE_PARAMS csp;
csp = (NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam,
typeof(NCCALCSIZE_PARAMS));
csp.rgrc0.Top = csp.rgrc0.Top - 3;
Marshal.StructureToPtr(csp, m.LParam, false);
}
break;
}
}
и пустое пространство сверху ушло.
Я не мог повторить это в Windows 7 - я получил белый квадрат.
(Это зависит от FormBorderStyle - я поставил 'None' в нем, чтобы завершить удаление границы)
Шаги, которые я предпринял:
1. Создайте новое приложение Windows Forms.
2. Нажмите Окно формы
3. Свойства->
3.1. FormBorderStyle = Нет
3.2. ControlBox = False
3.3. Text =
(В тексте я удалил "Form1" и оставил его пустым)
Какой проект вы использовали?
Я не мог найти это легко с WPF, поэтому я предполагаю, что это приложение Windows Forms.Какую операционную систему вы используете?
Я использую Windows 7, у вас Windows 10?Что я не понимаю, так это то, как у вас есть кнопки "Свернуть", "Развернуть" и "Закрыть" справа. ControlNox=false удаляет их мгновенно.
Если вы нажмете на форму, перейдите в свойства, там есть раздел FormBorderSyle и поместите его в False
Я знаю, что этот пост старый, но я наткнулся на эту проблему и, наконец, решил ее, поэтому я отправляю ее здесь для всех, кто может помочь.
Итак, я создал настраиваемый класс формы без полей с изменяемым размером с моей собственной панелью управления и кнопками, похожий на OP. Идея заключалась в том, чтобы иметь эту Форму со всеми связаннымиWndProc
code, действовать как базовый класс для всех других диалоговых форм в проекте.
Когда я запускал свой проект, я получал точно такую же белую линию в верхней части формы, хотя я правильно установил все соответствующие свойства формы.
Проблема в том, что с наследованием форм все производные формы также имеют свои собственные частные InitializeComponent
метод. Я понятия не имел, что VS IDE установила для свойства FormBorderStyle значениеSizable
в производном классе Form, потому что мое внимание было сосредоточено только на настраиваемом базовом классе.
Если вы используете собственный базовый класс для своего Form
, установка FormBorderStyle
правильно в производном классе устраняет проблему.
Если вы просто не установите для FormBorderStyle значение None для тени, я уже ответил, как легко создавать тени здесь: Drop shadow on Borderless Winform-No flicker or Исчезновение
Вот мой ответ:
Пожалуйста, попробуйте следующие шаги и вернитесь в случае ошибок:
Добавьте приведенный ниже код в новый файл кода с именем 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);