gpt4 book ai didi

c# - FormBorderStyle.None 去除windows 8原生打开效果

转载 作者:行者123 更新时间:2023-11-30 15:28:57 30 4
gpt4 key购买 nike

我喜欢在 C# 中让我的表单无边框。所以我使用了这段代码:

FormBorderStyle = FormBorderStyle.None;

但它消除了 windows 8 的 aero 效果。窗体突然像眨眼一样打开。

如何恢复气动效果?

最佳答案

我正在使用 the C++ reference 回答我自己的问题我写了一个继承自Form Class的类。应用程序中的每个表单都应继承自此类而不是表单类。

 public class AeroForm : Form
{
int _w = 100, _h = 100;
bool aero = false;

[StructLayout(LayoutKind.Sequential)]
struct MARGINS { public int Left, Right, Top, Bottom; }

[DllImport("dwmapi.dll", PreserveSig = false)]
static extern void DwmExtendFrameIntoClientArea
(IntPtr hwnd, ref MARGINS margins);

[DllImport("dwmapi.dll", PreserveSig = false)]
static extern bool DwmIsCompositionEnabled();

public AeroForm()
{
aero = IsCompositionEnabled();
}

public AeroForm(int width, int height)
: this()
{
_w = width;
_h = height;
Size = new Size(width, height);
}

protected override void WndProc(ref Message m)
{
const int WM_NCCALCSIZE = 0x0083;
switch (m.Msg)
{
case WM_NCCALCSIZE:
if (aero)
return;
break;
}
base.WndProc(ref m);
}

//this is for checking the OS's functionality.
//Windows XP does not have dwmapi.dll
//also, This corrupts the designer...
//so i used the Release/Debug configuration
bool IsCompositionEnabled()
{
#if !DEBUG
return File.Exists(Environment.SystemDirectory + "\\dwmapi.dll")
&& DwmIsCompositionEnabled();
#else
return false;
#endif
}

//this one is used for a shadow when aero is not available
protected override CreateParams CreateParams
{
get
{
const int CS_DROPSHADOW = 0x00020000;
const int WS_MINIMIZEBOX = 0x20000;
const int CS_DBLCLKS = 0x8;
CreateParams cp = base.CreateParams;
if (!aero)
cp.ClassStyle |= CS_DROPSHADOW;
cp.Style |= WS_MINIMIZEBOX;
cp.ClassStyle |= CS_DBLCLKS;
return cp;
}
}

//this is for aero shadow and border configurations
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (aero)
{
FormBorderStyle = FormBorderStyle.FixedSingle;
ControlBox = false;
MinimizeBox = false;
MaximizeBox = false;
Size = new Size(_w, _h);
MARGINS _glassMargins = new MARGINS()
{
Top = 5,
Left = 5,
Bottom = 5,
Right = 5
};
DwmExtendFrameIntoClientArea(this.Handle, ref _glassMargins);
}
else
FormBorderStyle = FormBorderStyle.None;
}

//When you minimize and restore, the size will change.
//this override is for preventing this unwanted resize.
protected override void OnPaint(PaintEventArgs e)
{
if (aero)
Size = new Size(_w, _h);
base.OnPaint(e);
}
}

使用 Show()Application.Run() 效果很好!但是当使用 ShowDialog() 打开表单时,它有一些回归。关闭表单,您会看到一个边框,该边框会在您的客户端内容隐藏后关闭。

关于c# - FormBorderStyle.None 去除windows 8原生打开效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24641829/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com