这个问题已经困扰我一段时间了,也许答案很简单,或者需要更多的VCL技巧或魔法来实现我想要的,但无论如何,我都不知道如何解决我的问题。
如果您查看Delphi表单设计器,您会发现当鼠标移动到它们上面时,控件都不会有任何动画效果,也不能接收焦点或输入(例如您不能在TEdit中键入内容、点击TCheckBox或移动TScrollBar等),只有在运行时,控件才能正常地响应用户交互。
我想知道如何在运行时实现此类行为,例如将控件设置为像设计状态模式一样。但是,控件仍然应该响应鼠标事件,例如
这是我最接近的实现:
可以简单地称之为:
例如,表单上的所有控件:
我注意到以上代码存在两个问题:尽管控件似乎变成了设计状态,但某些控件(如TButton)仍然具有动画效果。另一个问题是,当控件处于设计状态时,按下左Alt键会导致它们消失。
所以我的问题是,我如何在运行时将控件放入类似Delphi表单设计器的设计状态模式中,其中这些控件不会动画(基于Windows主题),也不能接收焦点或输入?
为了使这一点更清楚,请看一下基于上面的代码示例的此示例图像,其中控件不再处于活动状态,但TButton的动画绘制仍处于活动状态:
但实际上应该是:
从上面的两个图像中,只有TCheckBox控件可以交互。
是否有一个隐藏的程序可以改变控件的状态?或者可能更适合实现这一点的方法?迄今为止,我设法获得的代码只会出现更多问题。
将控件设置为
如果您查看Delphi表单设计器,您会发现当鼠标移动到它们上面时,控件都不会有任何动画效果,也不能接收焦点或输入(例如您不能在TEdit中键入内容、点击TCheckBox或移动TScrollBar等),只有在运行时,控件才能正常地响应用户交互。
我想知道如何在运行时实现此类行为,例如将控件设置为像设计状态模式一样。但是,控件仍然应该响应鼠标事件,例如
OnMouseDown
、OnMouseMove
、OnMouseUp
等,以便可以根据需要移动和调整大小。这是我最接近的实现:
procedure SetControlState(Control: TWinControl; Active: Boolean);
begin
SendMessage(Control.Handle, WM_SETREDRAW, Ord(Active), 0);
InvalidateRect(Control.Handle, nil, True);
end;
可以简单地称之为:
procedure TForm1.chkActiveClick(Sender: TObject);
begin
SetControlState(Button1, chkActive.Checked);
SetControlState(Button2, chkActive.Checked);
SetControlState(Edit1, chkActive.Checked);
end;
例如,表单上的所有控件:
procedure TForm1.chkActiveClick(Sender: TObject);
var
I: Integer;
Ctrl: TWinControl;
begin
for I := 0 to Form1.ControlCount -1 do
begin
if Form1.Controls[I] is TWinControl then
begin
Ctrl := TWinControl(Form1.Controls[I]);
if (Ctrl <> nil) and not (Ctrl = chkActive) then
begin
SetControlState(Ctrl, chkActive.Checked);
end;
end;
end;
end;
我注意到以上代码存在两个问题:尽管控件似乎变成了设计状态,但某些控件(如TButton)仍然具有动画效果。另一个问题是,当控件处于设计状态时,按下左Alt键会导致它们消失。
所以我的问题是,我如何在运行时将控件放入类似Delphi表单设计器的设计状态模式中,其中这些控件不会动画(基于Windows主题),也不能接收焦点或输入?
为了使这一点更清楚,请看一下基于上面的代码示例的此示例图像,其中控件不再处于活动状态,但TButton的动画绘制仍处于活动状态:
但实际上应该是:
从上面的两个图像中,只有TCheckBox控件可以交互。
是否有一个隐藏的程序可以改变控件的状态?或者可能更适合实现这一点的方法?迄今为止,我设法获得的代码只会出现更多问题。
将控件设置为
Enabled := False
也不是我正在寻找的答案,是的,行为有点相同,但是控件的绘制方式当然会不同以显示它们已被禁用,这不是我要找的。
ComponentState
中的csDesigning
吗? - Jerry DodgeControlStyle
和ControlState
,除非我做错了什么,否则无法让它们正常工作。此外,我认为csDesigning
是只读的,因为我现在离开了我的机器,所以稍后需要再次查看。 - Craig