AutoCAD .NET 二次开发(2020版)在模态窗口中控制窗口的隐藏和显示

发布时间 2023-11-30 15:26:16作者: -Cloud-

如果你创建了模态窗口,虽然一些API,例如Editor.GetSelection(),可以自动隐藏模式对话框,但如果从模态窗口出发与编辑器(编辑器指的模型空间,即你绘图的窗口)交互,

它会在GetSelection()完成后立即显示对话框,而你的其它代码可能仍在进行中,两者处于异步模式。

由于模式对话框很可能在其它代码完成之前显示,因此 AutoCAD UI 更新会被模态对话框阻止,可能产生一些问题,

比如你GetSelection()完成后还要从控制台输出一些信息,但是因为窗口显示出来了,那些信息可能输出到一半就暂停了,因为编辑器区域不刷新了。

 

 所以在某些情况下可以选择先调用Editor.StartUserInteraction() 函数,手动隐藏窗口,它会在using结束之时才让窗口显示出来。

 1 private void button_Click(object sender, EventArgs e)
 2 {
 3     Document doc = AcAp.DocumentManager.MdiActiveDocument;
 4     Editor ed = doc.Editor;
 5     using (ed.StartUserInteraction(this))
 6     {
 7         PromptSelectionOptions ops = new PromptSelectionOptions { SingleOnly = true };
 8         var selectionResult = doc.Editor.GetSelection(ops);
 9         if (selectionResult.Status == PromptStatus.OK)
10         {
11             ed.WriteMessage("do something...");
12             ed.WriteMessage("do something...");
13         }
14     }
15 }    

在这个示例代码中,GetSelection()选择结束后,窗口仍然处于隐藏状态,直到第14行括号执行结束,窗口才会显示。

如果不使用StartUserInteraction() 函数,那么GetSelection()选择结束时,窗口会立即出现,if中的代码如果还在继续和编辑器交互,就可能被卡住,编辑器停止刷新,不会在编辑器中体现出来。

注意,在CAD2014中测试,StartUserInteraction()函数无效,在CAD2020中测试该函数有效,所以可能低版本对这个函数的支持有BUG,应该至少选择比2014更高的版本。