FormBorderStyle.None 去除 windows 8 原生打开效果
Posted
技术标签:
【中文标题】FormBorderStyle.None 去除 windows 8 原生打开效果【英文标题】:FormBorderStyle.None removes the native open effect of windows 8 【发布时间】:2014-07-08 21:21:47 【问题描述】:我喜欢在 C# 中使我的表单无边框。所以我使用了这段代码:
FormBorderStyle = FormBorderStyle.None;
但它消除了 windows 8 的航空效果。窗体突然打开,就像眨眼一样。
如何恢复气动效果?
【问题讨论】:
Hmya,这取决于你想让自己陷入多少麻烦。已经有a good answer available。处理副作用是你要承担的责任。 那是在 C++ 中,我希望它在我的 C# Windows 窗体中 @MatinLotfaliee 所以?它仍然只是 Windows 消息。只需将其翻译成winforms。你只需要做一些工作才能让它工作:) 我明白了,但是我在想它是否可以用C#翻译,为什么没有翻译后的帖子?也许他们没能做到。 【参考方案1】:我正在使用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() 打开表单时,它有一些回归。关闭表单,您将看到在您的客户端内容隐藏后关闭的边框。
【讨论】:
@HansPassant:你能帮我解决 ShowDialog() 糟糕的结束效果吗?以上是关于FormBorderStyle.None 去除 windows 8 原生打开效果的主要内容,如果未能解决你的问题,请参考以下文章
C#Formborderstyle=none怎么改变窗体大小