在我们公司,我们使用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不会失去焦点,我该怎么办?
非常感谢您提前提供任何帮助。
如果我无法正确描述我的问题,请随时向我提问。
作为答案,我引用了Remy Lebeau的评论
TCustomButton是一个窗口控件。 TSpeedBtn是一个图形控件。窗口控件改变输入焦点,图形控件不改变。就那么简单。没有什么可以做的,不会产生副作用。