gpt4 book ai didi

delphi - 正确处理模态窗口 "Minimize"行为

转载 作者:行者123 更新时间:2023-12-03 14:54:09 26 4
gpt4 key购买 nike

我有以下问题:我们正在构建一个相当大的应用程序(win32,Delphi 6 Enterprise)。在应用程序的几个部分中,使用了模态窗口,通常包含主窗口选择的详细信息。

我们对 WM_SYSCOMMAND 消息的处理进行了修改,这样,如果窗口是模式窗口,则 SW_SHOWMINNOACTIVE 消息将被发送到应用程序的主窗口。这会导致整个应用程序被最小化,而不仅仅是模式形式。

但是,在特定情况下会出现一个问题:如果调用窗口设置为全屏,则在恢复时,模式窗口将出现在(禁用的)最大化主窗口下方(这似乎发生在 Windows 上) 7)

我的问题有两个:

首先,当应用程序恢复时,我似乎没有收到任何系统命令消息,因此我无法引入恢复 Z 顺序的代码,因为我不知道将其放在哪里。其次,在我看来,如果整个应用程序被最小化,单击任务栏中的应用程序按钮应该将其恢复为相同状态,而不是在其下方显示模式窗口。有办法解决吗?

编辑:我们做了一些额外的测试,看来我们实际上可以在主窗体的 WM_ACTIVATE 处理程序中检测到问题。我们还可以识别该阶段的模态窗口。但是,我无法找到将其恢复到 Z 顺序顶部的方法。

Edit2:这是最小化模态表单时最小化应用程序的代码:

procedure TfmGITForm.WMSysCommand(var Message: TWMSysCommand);
begin
if (fsModal in FormState) or
not Application.MainForm.Visible then
begin
case Message.CmdType of
SC_MINIMIZE:
begin
ShowWindow(Application.Handle, SW_SHOWMINNOACTIVE);
end;
SC_RESTORE:
begin
ShowWindow(Application.Handle, SW_SHOWNORMAL);
inherited;
end;
else
inherited;
end; // case
end
else
inherited;
end;

我们所有的形式都源自那个形式。

最佳答案

重写对话框的 CreateParams 函数并将 Params.WndParent 设置为全屏窗口(或 Owner.Handle 如果您拥有事情正确)。默认是Application.Handle,这会导致此类问题。 Delphi 后续版本中引入的 PopupParent 属性执行完全相同的操作。

关于delphi - 正确处理模态窗口 "Minimize"行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6303621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com