用户界面 – Delphi应用程序主表单暂时轻弹到前面
我们有一个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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |