谈到绘制, 推荐看看这篇 2D中的自定义绘图 的教程。同样的原理适用与控件绘制。这里有些函数值得一提, 因为它们在绘制时有用, 所以接下来将进行详细说明:
Unlike 2D nodes, "size" is important with controls, as it helps to
organize them in proper layouts. For this, the
property is provided. Checking it during
_draw() is vital to ensure
everything is kept in-bounds.
Some controls (such as buttons or text editors) might provide input
focus for keyboard or joypad input. Examples of this are entering text
or pressing a button. This is controlled with the
property. When drawing, and if the control supports input focus, it is
always desired to show some sort of indicator (highlight, box, etc.) to
indicate that this is the currently focused control. To check for this
status, the Control.has_focus() method
public override void _Draw()
As mentioned before, size is important to controls. This allows
them to lay out properly, when set into grids, containers, or anchored.
Controls, most of the time, provide a minimum size to help properly
lay them out. For example, if controls are placed vertically on top of
each other using a VBoxContainer,
the minimum size will make sure your custom control is not squished by
the other controls in the container.
To provide this callback, just override
return Vector2(30, 30)
public override Vector2 _GetMinimumSize()
return new Vector2(20, 20);
Alternatively, set it using a function:
public override void _Ready()
SetCustomMinimumSize(new Vector2(20, 20));
在此之前有几个关于输入的教程, 但值得一提的是, 控件有一个特殊的输入方法, 只有在以下情况下才起作用:
- 鼠标按键在此控件上被按下 (控件始终捕获输入, 直到按钮被释放)
- Control provides keyboard/joypad focus via
This function is
Simply override it in your control. No processing needs to be set.
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.pressed:
print("Left mouse button was pressed!")
public override void _GuiInput(InputEvent @event)
if (@event is InputEventMouseButton mbe && mbe.ButtonIndex == (int)ButtonList.Left && mbe.Pressed)
GD.Print("Left mouse button was pressed!");
有关事件(event)本身的详细信息, 请查看 InputEvent 教程。
Controls also have many useful notifications for which no dedicated callback
exists, but which can be checked with the _notification callback:
pass # Mouse entered the area of this control.
pass # Mouse exited the area of this control.
pass # Control gained focus.
pass # Control lost focus.
pass # Theme used to draw the control changed;
# update and redraw is recommended if using a theme.
pass # Control became visible/invisible;
# check new status with is_visible().
pass # Control changed size; check new size
# with get_size().
pass # For modal pop-ups, notification
# that the pop-up was closed.
public override void _Notification(int what)
// Mouse entered the area of this control.
// Mouse exited the area of this control.
// Control gained focus.
// Control lost focus.
// Theme used to draw the control changed;
// update and redraw is recommended if using a theme.
// Control became visible/invisible;
// check new status with is_visible().
// Control changed size; check new size with get_size().
// For modal pop-ups, notification that the pop-up was closed.