微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 如何在拖动时避免表单获得焦点

我有一个只包含TTouchKeyboard的简单表单.表单BorderStyle设置为bsToolWindow.为了避免在单击触摸键盘时获得焦点,我使用此实现处理WM_MOUSEACTIVATE消息:
procedure TKeyboardForm.WMMouseActivate(var Message: TWMMouseActivate);
begin
  Message.Result := MA_NOACTIVATE;
end;

BorderStyle设置允许使用标题栏拖动表单,但在这种情况下,表单仍然获得焦点.有没有办法避免这种情况?

更新:我尝试在CreateParams中将WS_EX_NOACTIVATE添加到ExStyle,但不幸的是,这不会阻止表单在拖动时获得焦点.

procedure TKeyboardForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE;
end;

解决方法

WMMouseActivate(),WMNCActivate()和重置焦点的以下组合似乎满足您的愿望:

键盘形式(使用BorderStyle = bsToolWindow)具有WM_MOUSEACTIVATE(正如您已有)和WM_NCACTIVATE的消息处理程序.后者有一个点,用编辑控件将焦点重置到窗口.

此外,keyboardform将跟踪哪个表单保存了具有焦点的编辑(或其他)控件,并通过引入一个新的显示方法(我称之为ShowUnfocused())和一个名为FocusedForm:THandle的字段来实现.

procedure TKbdForm.ShowUnfocused(FocusedWindow: THandle);
begin
  FocusedForm := FocusedWindow;
  Show;
end;

procedure TKbdForm.FormShow(Sender: TObject);
begin
  SetForegroundWindow(FocusedForm);
end;

procedure TKbdForm.WMMouseActivate(var Message: TWMMouseActivate);
begin
  Message.Result := MA_NOACTIVATE;
end;

procedure TKbdForm.WMNCActivate(var Message: TWMNCActivate);
begin
  Message.Result := 1; // important
  SetForegroundWindow(FocusedForm);
end;

Keyboardform由以下编辑控件的常用代码调用

procedure TForm17.EditClick(Sender: TObject);
begin
  KbdForm.ShowUnfocused(self.Handle);
  (Sender as TWinControl).SetFocus;
end;

上述内容的替代方法可以是设置BorderStyle = bsNone并使用Mouse Down,Move,Up事件直接从表单表面(或者可能是模板顶部框架的面板)排列表单的拖动,以及添加关闭按钮.挑战在于让它在视觉上可以接受.

原文地址:https://www.jb51.cc/delphi/101834.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐