#c# #.net #winforms
#c# #.net #winforms
Вопрос:
Я разрабатываю приложение WinForms MDI в VS2010 (.NET 4.0), и я просто ненавижу 3D-границу в родительской форме MDI.
Итак, есть идеи о том, как ее удалить (сделать ее плоской или просто без границ)?
Комментарии:
1. Нет, вы довольно застряли с этим. Класс MdiClient не имеет свойства BorderStyle, и я не вижу очевидного способа подключиться к созданию его экземпляра.
Ответ №1:
Я знаю, что это старый пост, но я потратил некоторое время и усилия на создание 3D-границ (потому что мне это тоже было нужно) из фрагментов в Интернете, включая:
Элементы со страницы Джейкоба Слуссера на codeproject.com (Дата обращения 1 августа’12)
Итак, вот что:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MDITest
{
public static class MDIClientSupport
{
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", ExactSpelling = true)]
private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
private const int GWL_EXSTYLE = -20;
private const int WS_EX_CLIENTEDGE = 0x200;
private const uint SWP_NOSIZE = 0x0001;
private const uint SWP_NOMOVE = 0x0002;
private const uint SWP_NOZORDER = 0x0004;
private const uint SWP_NOREDRAW = 0x0008;
private const uint SWP_NOACTIVATE = 0x0010;
private const uint SWP_FRAMECHANGED = 0x0020;
private const uint SWP_SHOWWINDOW = 0x0040;
private const uint SWP_HIDEWINDOW = 0x0080;
private const uint SWP_NOCOPYBITS = 0x0100;
private const uint SWP_NOOWNERZORDER = 0x0200;
private const uint SWP_NOSENDCHANGING = 0x0400;
public static bool SetBevel(this Form form, bool show)
{
foreach (Control c in form.Controls)
{
MdiClient client = c as MdiClient;
if (client != null)
{
int windowLong = GetWindowLong(c.Handle, GWL_EXSTYLE);
if (show)
{
windowLong |= WS_EX_CLIENTEDGE;
}
else
{
windowLong amp;= ~WS_EX_CLIENTEDGE;
}
SetWindowLong(c.Handle, GWL_EXSTYLE, windowLong);
// Update the non-client area.
SetWindowPos(client.Handle, IntPtr.Zero, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
return true;
}
}
return false;
}
}
}
В вызове события загрузки формы:
form.SetBevel(false);
Не забудьте изменить пространство имен и помните, что это метод расширения, но его можно изменить, чтобы он был просто вызовом метода в другом классе или в вашей родительской форме MDI.
Комментарии:
1. Он больше не работает с .NET Framework 4 (и, возможно, с более высокими версиями) в Windows 10. Может быть, это связано с темой Aero, я не знаю.
2. Я только что протестировал его, и он отлично работает на .NET 4.8. Однако в моей системе ожидаются некоторые обновления, поэтому я проверю его снова после этого.
3. @Roni Tovi просто чтобы подтвердить то, что я сказал ранее, код работает на .NET 4.0 и 4.8 в Windows 10.
4. Нет — это работает не полностью. Это работает только для левой-правой и нижней границ. Я все еще вижу верхнюю границу.
5. Работал для меня на: Windows 10 V1903; .net 4.6.1.
Ответ №2:
Если вы предпочитаете не импортировать внешние библиотеки, существует также следующий чит, который перемещает / изменяет размер элемента управления контейнером mdi.
protected override void OnLoad(EventArgs e)
{
var mdiclient = this.Controls.OfType<MdiClient>().Single();
this.SuspendLayout();
mdiclient.SuspendLayout();
var hdiff = mdiclient.Size.Width - mdiclient.ClientSize.Width;
var vdiff = mdiclient.Size.Height - mdiclient.ClientSize.Height;
var size = new Size(mdiclient.Width hdiff, mdiclient.Height vdiff);
var location = new Point(mdiclient.Left - (hdiff / 2), mdiclient.Top - (vdiff / 2));
mdiclient.Dock = DockStyle.None;
mdiclient.Size = size;
mdiclient.Location = location;
mdiclient.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
mdiclient.ResumeLayout(true);
this.ResumeLayout(true);
base.OnLoad(e);
}
Ответ №3:
Попробуйте изменить свойство FormBorderStyle на FixedSingle
Комментарии:
1. Это первое, что я попробовал … основная форма теряет «размерность», а 3D-граница все еще там!