1

我有一个应用程序,用户在登录时会收到一个模态对话框提示,他们必须在其中选择他们希望工作的设施。在这个阶段,应用程序如下所示:

在此处输入图像描述

通过调用此方法显示模态对话框:

bool __fastcall ShowFacChoiceForm()
{
    TFacChoiceForm *Form = new TFacChoiceForm( Application );

    bool Result = ( Form->ShowModal() == mrOk );

    delete Form;

    return Result;
}

在这种情况下,TFacChoiceForm继承自TForm所以ShowFacChoiceForm()函数调用此处记录的标准TForm.ShowModal方法

我遇到的问题是,如果我的应用程序失去焦点,除非单击模式对话框本身,否则它不能再次成为活动窗口。为了更好地说明这一点,我将展示以下场景:

假设现在是星期五下午,我决定放纵一下并阅读一些网络漫画。打开我的应用程序后,我会在其顶部打开另一个窗口,如下所示:

在此处输入图像描述

然后,我的老板不知从何而来进行绩效评估,我试图通过单击主窗体上的某个位置来重新调整我的应用程序。例如,在下一个图像中这个红色 X 的位置。

在此处输入图像描述

在上图中,我点击了红色 X 的位置。现在,包含网络漫画的表单和我的应用程序都处于非活动状态。因此,我的应用程序不会出现在屏幕前面。

但是,如果我能够单击模态对话框中的某个位置,例如下图中的红色 X...

在此处输入图像描述

...然后我的申请就会像人们期望的那样出现在前面。

在此处输入图像描述

为了解决这个问题,我已经研究过使用 Windows API 中的SetForegroundWindow之类的东西,但我无法找到触发事件的方法,因为我的主窗体在打开模式对话框时不会触发事件。

我的问题是,我如何确保如果用户单击我的应用程序上的任何位置,它会被带到前面?我可以在我的表单中编辑一个属性来执行此操作吗?

4

1 回答 1

0

如果在模态对话框的 ondeactivate 中将 modalresult 设置为 mrcancel,则单击主窗体时将获得焦点。然后,您可以检查用户是否已登录主窗体的 mousedown 事件,如果没有,则再次显示模式对话框。

于 2015-10-24T17:06:51.150 回答