Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在窗口可见后将其设置为模态_.net_C++ - Fatal编程技术网

.net 在窗口可见后将其设置为模态

.net 在窗口可见后将其设置为模态,.net,c++,.net,C++,在窗口可见后,是否可以在模式窗口和非模式窗口之间切换 这就是我需要的。。。调用一个传递窗口句柄的方法并设置它是否为模态 如果可能,任何样品都会有很大帮助 .NET、C++等 谢谢 编辑: 为什么? 在本例中,我使用TWAIN扫描图像,“某些”数据源不会将其对话框显示为模态,即使我将其设置为模态,如果它不是模态,用户可能会弄乱背景窗口…您不能使用标准WinAPI执行此操作,我相当肯定您不能使用.NET framework执行此操作。您可以通过创建自己的消息泵例程来伪造它,该例程在从非模态切换到模

在窗口可见后,是否可以在模式窗口和非模式窗口之间切换

这就是我需要的。。。调用一个传递窗口句柄的方法并设置它是否为模态

如果可能,任何样品都会有很大帮助

.NET、C++等 谢谢

编辑: 为什么?
在本例中,我使用TWAIN扫描图像,“某些”数据源不会将其对话框显示为模态,即使我将其设置为模态,如果它不是模态,用户可能会弄乱背景窗口…

您不能使用标准WinAPI执行此操作,我相当肯定您不能使用.NET framework执行此操作。您可以通过创建自己的消息泵例程来伪造它,该例程在从非模态切换到模态时被调用。
然而,听起来这是对错误问题的回答。你能解释一下为什么需要它在模态和非模态之间切换吗?

对于.NET框架,我知道没有办法实现这种行为。在.NET中创建非模态或模态表单的方法是分别通过或方法来显示它


我不明白这样一个事实,你需要显示它非模态,然后再使它模态。你想完成什么?也许进一步的细节可以帮助我们帮助您,或者找到另一种方法,让您找到更好的解决方案,我希望。

我想知道为什么OP会问这个问题,但这让我思考起来。我有一些东西可能是找到答案的开始

我创建了两个表单:Form1和Form2。Form1有一个按钮;Form2有一个文本框

我为Form1尝试了以下代码:

    private void button_Click(object sender, EventArgs e)
    {
        form2.Show(this);            
        System.Threading.Thread thread = new System.Threading.Thread(showModal);
        thread.Start();
    }        

    private void showModal()
    {
        System.Threading.Thread.Sleep(2000);
        form2.Visible = false;
        form2.ShowDialog(this);
    }

单击Form1上的按钮时,Form2显示为非模式框;它等待两秒钟;然后它隐藏Form2,然后将其显示为模态框。如果我在Form2切换之前输入它的文本框,文本将被保留。但是,当我单击Form2右上角的x时,我无法关闭它。由于它是模态的,我必须通过任务管理器终止程序以停止它。

窗口模态主要由窗口句柄所有权驱动。禁用父窗口和设置本地消息循环是次要的工件

将模式窗口句柄的所有者设置为应用程序主窗口会创建这样的行为,即单击主窗口会将焦点发送到模式子窗口。如果所有者设置不正确,则在显示“模态”窗口时可以聚焦主窗口,这不是模态行为

我似乎隐约记得,您还需要禁用owner窗口,以防止在模式窗口处于活动状态时鼠标单击owner窗口上的按钮或选择菜单

模态窗口通常也与本地消息循环相关联,但这与窗口的模态UI行为关系不大,而与执行代码的模态状态有关。在Form.ShowDialog()内运行本地消息循环可使函数调用与模式窗口生存期同步-它可防止函数在模式窗口关闭之前返回调用方

创建子窗口句柄时,设置窗口句柄的所有者只能是一个。子窗口句柄存在后,无法更改所有者。请参阅MSDN上的

因此,您不能简单地翻转开关,使非模态窗口成为模态窗口

最好的办法是销毁窗口句柄,并与所需的所有者一起重新创建它。这可以在很少或没有屏幕闪烁的情况下完成,但更大的问题是在窗口上保留子控件的任何本地状态(编辑框中的文本、复选框状态等)。销毁窗口将丢失子窗口中的任何状态信息,因此您需要确保首先提取所有状态,然后重新创建窗口句柄,然后恢复子窗口数据