我有一个强大的命名程序集。
以前曾经问过......但是只是出于不同的目的。
我有一个Form基类。实现类在基类IsBusy
上设置属性时。我想阻止与Form的所有交互(设置Enabled = false是不够的 - 我也想阻止移动,调整大小,关闭等等......我不希望我的控件在{{1}时看起来被禁用})并在前面显示一个弹出加载表单(带有加载动画的透明无边框表单)。
在我的加载动画表单上调用ShowDialog可以阻止调用表单上的交互...但显然我也希望调用表单代码继续执行。
现在我正在使用新的LoadingForm()。Show(),然后在我的调用Form上处理WndProc,如果IsBusy == true
我压制所有WndProc消息......但我不喜欢这种方法。它也会阻止表单重新绘制,这是我不想要的。
如果我知道所有不同类型的消息都允许在IsBusy == true
期间进行正确的重新绘制,我不介意WndProc方法......但我没有。
所以,我的问题是:
有更好的解决方案吗?
或
罐头有人告诉我应该通过什么WndProc消息?或者在哪里找到词汇表?
感谢。
答案 0 :(得分:13)
我结束了BeginInvoke的ShowDialog:
myForm.BeginInvoke(new Action(() => new LoadingForm().ShowDialog()));
具有让该行之后的代码继续运行并仍然阻止与myForm的所有交互的预期效果。
答案 1 :(得分:3)
如果您想通过绘画,请允许WM_PAINT
和WM_NCPAINT
。
答案 2 :(得分:2)
你太复杂了。您所要做的就是阻止对话框关闭。实现FormClosing事件(或覆盖OnFormClosing,更好)并在操作繁忙时设置e.Cancel = true。然后,用户无法干扰您的过程。
这是假设您使用工作线程来实现操作。