是否有可能以这样的方式操纵TCustomButton的后代:单击它而不窃取其他控件的焦点?

时间:2019-04-08 07:46:50

标签: delphi delphi-xe2

在我们公司中,我们使用了TCustomButton的强大后代。

对于一个新的应用程序,我希望一个按钮的行为基本上像一个“ Speedbtn”,它没有TabStop,尤其是不要窃取其他控件(例如TEdit)的焦点。如果我能够操纵TCustomButton的后代,我将非常高兴,这样我就不必编写全新的按钮组件,为此我必须实现TCustomButton的后代已经提供的许多功能(例如公司设计等)

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

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

无论如何,这是我的示例:我有一个仅包含TEdit和TCustomButton的后代的TForm,如果WM_LBUTTONDOWN或WM_LBUTTONDBLCLK出现,它已经失去了获得焦点的功能(通常它是TButtonControl的后代)通过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不会失去焦点。

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

如果我未能正确描述我的问题,请随时问我任何问题。

1 个答案:

答案 0 :(得分:0)

作为回答,我引用了雷米·勒博的评论

  

TCustomButton是一个窗口控件。 TSpeedBtn是一个图形控件。   窗口控件会更改输入焦点,而图形控件则不会。   就那么简单。您无能为力,无能为力   效果。