在我们公司中,我们使用了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不会失去焦点。
非常感谢您提前提供帮助。
如果我未能正确描述我的问题,请随时问我任何问题。
答案 0 :(得分:0)
作为回答,我引用了雷米·勒博的评论
TCustomButton是一个窗口控件。 TSpeedBtn是一个图形控件。 窗口控件会更改输入焦点,而图形控件则不会。 就那么简单。您无能为力,无能为力 效果。