是否有可能操纵TCustomButton的后代,以便点击它,不会窃取另一个控件的焦点?

问题描述 投票:0回答:1

在我们公司,我们使用TCustomButton的一个非常强大的后代。

对于一个新的应用程序,我想要一个基本上表现得像“Speedbtn”的按钮,它没有TabStop,特别是不会窃取其他控件的焦点,例如TEdit。我很乐意,如果我能够只是简单地使用TCustomButton的后代,那么我就不必编写一个全新的按钮组件,为此我必须实现我们TCustomButton的后代已经提供的许多东西(如企业设计等)

我知道这不是一件容易的事,因为据我所知,点击按钮触发消息集中自己的决定(窃取了Tedit的焦点)取决于windows中的注册表(“TCustomButton.CreateParams”??)。

如果一个可能的解决方案是太多的黑客,我可能甚至不会在我们的系统中使用它,但我仍然会对它很感兴趣,因为我是一个好奇的人:)。

无论如何这里是我的例子:我有一个TForm,它只包含一个TEdit和一个TCustomButton的后代,它已经失去了功能(它通过作为TButtonControl的后代而有所不同)来获得焦点,如果WM_LBUTTONDOWN或WM_LBUTTONDBLCLK来自WndProc 。

type
  TMyBtn = class (TCustomButton)
  //
  // ...  A lot of self-written stuff
  //
  protected
    procedure WndProc(var Message: TMessage); override;
  public
  //
  // ... A lot of self-written Properties
  //
  end;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TMyBtn;
  end;

implementation

procedure TMyBtn.WndProc(var Message: TMessage);

var
  hProc : procedure (var Message: TMessage) of object;

begin
  // Skip TButtonControl.WndProc and call
  // TWinControl.WndProc instead if Message type
  // is WM_LBUTTONDOWN or WM_LBUTTONDBLCLK
  if not (csDesigning in ComponentState)  then
  begin
    case Message.Msg of
      WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
      begin
        TMethod(hProc).Code := @TWinControl.WndProc;
        TMethod(hProc).Data := Self;
        hProc( Message);
        exit;
      end;
    end;
  end;

  inherited WndProc(Message);
end;

如果TEdit具有焦点并且我点击TCustomButton的后代(除了禁用按钮或重新聚焦TEdit等),TEdit不会失去焦点,我该怎么办?

非常感谢您提前提供任何帮助。

如果我无法正确描述我的问题,请随时向我提问。

delphi delphi-xe2
1个回答
0
投票

作为答案,我引用了Remy Lebeau的评论

TCustomButton是一个窗口控件。 TSpeedBtn是一个图形控件。窗口控件改变输入焦点,图形控件不改变。就那么简单。没有什么可以做的,不会产生副作用。

© www.soinside.com 2019 - 2024. All rights reserved.