.Net WinForms意外行为挂起带有SendMessage(…WM_SETREDRAW…)的表单布局,当其AllowTransparency=true时,隐藏表单

.Net WinForms意外行为挂起带有SendMessage(…WM_SETREDRAW…)的表单布局,当其AllowTransparency=true时,隐藏表单,winforms,transparency,sendmessage,Winforms,Transparency,Sendmessage,具有以下形式: Me.AllowTransparency = True Me.BackColor = Color.Magenta Me.TransparencyKey = Me.BackColor 并且做: SendMessage(pForm.Handle, WM_SETREDRAW, New IntPtr(CInt(False)), IntPtr.Zero) 隐藏窗体,没有透明度效果,效果很好 有解决办法吗?另一种真正暂停布局的方法 定义: Private Const WM_SETREDR

具有以下形式:

Me.AllowTransparency = True
Me.BackColor = Color.Magenta
Me.TransparencyKey = Me.BackColor
并且做:

SendMessage(pForm.Handle, WM_SETREDRAW, New IntPtr(CInt(False)), IntPtr.Zero)
隐藏窗体,没有透明度效果,效果很好

有解决办法吗?另一种真正暂停布局的方法

定义:

Private Const WM_SETREDRAW As Int32 = &HB
Private Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

使用Win10(1803)。

我看到了。Windows版本很重要,Win10 Fall Creator的版本在传统winapi中有着深刻的变化。一种解决方法是在窗体上停靠填充一个面板,并使用它来进行绘制和宿主控件,该面板手柄上的WM_SETREDRAW不会出错。并且考虑SynDeLayOutE()来暂停布局,而不是与WMJSETReDRAW相同的东西。我使用Win 10(1803)。是的,那个。最好把它放在你的问题中。SuspendLayout()还不够好,它显示了一些闪烁,但实际上并没有挂起表单…我尝试了你的解决方法,结果成功了!谢谢唯一的缺点是我需要在所有表单中放置一个面板作为背景面板。还有其他解决方法吗?我试图将面板放入我的基本表单中,但所有子代表单中的所有控件都不会自动添加到新面板的控件数组中…它们仍将添加到表单的控件数组中…我需要转到每个控件并手动更改。。