GTK+中构件的基本概念
分类:GTK+
有窗构件和无窗构件
根据是由有关联的GdkWindow,构件可以分为“有窗口构件”和“无窗口构件”
GdkWindow窗口和GtkWindow窗口是不一样的。GdkWindow是一个X服务器用于划分平面镜的抽象概念。一个GdkWindow窗口,对x服务器给出了关于将要显示的图形的结构信息。
大多数构件都有一个相关联的GdkWindow窗口,构件就绘制在这个窗口上。
有一些构件没有与之相关联的GdkWindow,是相对轻量级的,如GtkLabel构件。“无窗口的构件”绘制在它的父构件的GdkWindow窗口上。
一些操作要求有一个GdkWindow窗口(例如捕获事件,绘制背景颜色),因此不能在无窗口构件上做这些事情
敏感性
构件可以是敏感的或不敏感的,不敏感的构件不能对输入进行响应。一般不敏感的构件是灰色的,不能接收键盘焦点。
可以用gtk_widget_set_sensitive()函数改变构件的敏感性。该函数原型如下:
void gtk_widget_set_sensitive(GtkWidget *widget, gboolean sensitive);
构件缺省是敏感的。但只有构件的所有容器是敏感的,构件才是真正敏感的。因此,容器的敏感性影响整个容器内所有构件的敏感性。可用GTK_WIDGET_IS_SENSITIVE宏来测试构件的真正敏感性,用GTK_WIDGET_SENSITIVE宏测试构件本身的敏感性。
焦点,独占和缺省构件
焦点
X Window的当前顶层窗口某个构件可能具有键盘焦点。顶层窗口接收到的任何键盘事件都被发送到这个具有焦点的构件
大多数构件在具有焦点时,会有一个视觉指示,如具有一个细黑框。
独占
构件从其它构件中独占鼠标指针和键盘。即,构件是“模态”的,用户只能向这个构件中输入字符,键盘焦点也不能改变到其它构件。
有两种级别的独占:应用程序级的独占和Gdk级的独占。构件独占是一个GTK+的概念,它只独占同一个应用程序中的其它构件的事件。而Gdk级的独占发生在X服务器范围内,也就是,其它应用程序不能接收到键盘和鼠标事件
每个窗口至多有一个缺省构件。
构件状态
构件的状态决定了它们的外观。状态的准确含义及其视觉表达依赖于特定构件以及当前窗口管理器的主题
构件可能有5种状态,可以用GTK_WIDGET_STATE(widget)宏来获取构件的状态值,这个宏返回指示构件状态的常量。如下:
状态 | 状态值 | 含义 |
---|---|---|
normal | GTK_STATE_NORMAL | 就是原来该有的样子 |
active | GTK_STATE_ACTIVE | 构件被选中 |
prelight | GTK_STATE_PRELIGHT | 鼠标越过一个构件 |
selected | GTK_STATE_SELECTED | 构件是放在一个列表中,或者是在其它类似状态,当前是被选中的 |
insensitive | GTK_STATE_INSENSITIVE | 构件是灰色的,不活动的,或者不响应 |