加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

用户界面 – Delphi应用程序主表单暂时轻弹到前面

发布时间:2020-12-15 09:23:27 所属栏目:大数据 来源:网络整理
导读:我们有一个Delphi 2007应用程序,并且最近启用了MainFormOnTaskBar以更好地支持 Windows Aero.但是,因为单击时主窗体不会出现在所有子窗体的顶部,所以我们添加了以下代码. procedure TBaseForm.CreateParams(var Params: TCreateParams);begin inherited Crea
我们有一个Delphi 2007应用程序,并且最近启用了MainFormOnTaskBar以更好地支持 Windows Aero.但是,因为单击时主窗体不会出现在所有子窗体的顶部,所以我们添加了以下代码.

procedure TBaseForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);

  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0; 
end;

这样做的一个副作用是当在不处理该特定热键的子表单上按下Alt键热键时,主表单向前轻弹然后再向后弹回.如果处理热键,则不会发生此行为,可能是因为吞下了热键.

有没有其他人经历过这种行为,可以建议一个解决方法.

谢谢

解决方法

观察到的行为是VCL加速器支持主窗体上可能的主菜单的结果,因此即使其他窗体处于活动状态,您也可以从主窗体菜单中选择菜单项.

主窗体的句柄激活是通过主窗体的句柄上的SetFocus调用,而“应用程序”处理CM_APPSYSCOMMAND消息,该消息是从命令类型为SC_KEYMENU(窗口)时从“WinControl”(辅助格式)的WM_SYSCOMMAND处理程序发送的菜单激活 – Alt键).

请注意,此行为不是使用MainFormOnTaskBar然后重写CreateParams以使表单可以被带到前面的副作用.无论MainFormOnTaskBar的设置如何,都会发生相同的行为.唯一的区别是激活的主窗体在设置时不能位于辅助窗体的前面,但主窗体的激活方式完全相同.

您可以拦截以修改许多位置的行为,例如辅助表单上的WM_SYSKEYDOWN处理程序或辅助表单的OnKeyDown.在语义上更正确的覆盖,IMO,应该在辅助表单的IsShortCut上完成.如您所知,当辅助表单处理组合键时,系统键的处理将终止.然后,您可以告诉VCL您的表单需要密钥:

type
  TSecondaryForm = class(TForm)
    ..
  public
    function IsShortCut(var Message: TWMKey): Boolean; override;

...

function TSecondaryForm.IsShortCut(var Message: TWMKey): Boolean;
begin
  Result := True;
end;

当然,您可以根据参数进行微调以有条件地返回true.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读