第13章 窗口对象(控件)
控件是具有对象性质的窗口,在视窗世界中它们被称为控件,构造用户接口的元素。它
们能自动对某些事件起反应;例如,当一个按钮被按下时,它可能以不同的状态显示。控件
需要建立,具有能在它们存在的任何时间修改的特性,在它们不再需要时被删除。与窗口类
似,一个控件通过它的建立函数返回的句柄而引用。
控件需要使用视窗管理器。一旦一个控件被建立,它被处理成与其它窗口一样;WM 保
证它在需要的时候能正确的显示(及重绘)。当编写一个应用或一个用户接口时,控件并不需
要,但是它们能使编程更容易。
µC/GUI 中文手册
第 1 页
第 13 章 窗口对象(控件)
13.1 一些基础知识
有效的控件
下面的 µC/GUI 控件在当前是有效的:
名 称
说 明
BUTTON
可以按下的按钮。在按钮上可以显示文本或位图。
CHECKBOX
复选框,提供多个选项。
EDIT
单行文本编辑框,提示用户输入数字或文本。
FRAMEWIN
框架窗口,建立典型的 GUI 外形。
LISTBOX
PROGBAR
列表框,当被选中的项目会高亮显示。
进度条,用于观察。
RADIOBUTTON 单选按钮,可以选择。同一时间只有一个按钮被选中。
SCROLLBAR
滚动条,可以是水平或垂直的。
SLIDER
TEXT
滑动条,用于改变数值。
文本控件,典型应用在对话框中。
理解重绘机制
一个控件根据它的特性绘制自己。这一工作通过调用 WM 的 API 函数 WM_Exec()来完成。
如果在程序中没有调用 WM_Exec(),就必须调用 WM_Paint() 函数来绘制控件。在多任务环境
中的µC/GUI, 一个后台任务通常用于调用 WM_Exec() 并更新控件(及其它所有带有回调函数
的窗口)。这样就不必手工调用 WM_Paint();然而,手工调用仍然是合法的,如果你想保证控
件能立即被重绘的话,这样做也是有意义的。
当一个控件的属性被改变时,控件的窗口(或者它的一部分)被标记为无效,但是它不
会立即重绘。因此,这部分代码运行非常快。重绘在后面的时间通过 WM 完成,或通过为控件
调用 WM_Paint()函数(或者 WM_Exec(),直到所有的窗口都被重绘)来强制执行。
如何使用控件
假设我们要显示一个进度条。需要写以下的代码:
PROGBAR_Handle hProgBar;
GUI_DispStringAt(“Progress bar”, 100, 20);
hProgBar = PROGBAR_Create(100, 40, 100, 20, WM_CF_SHOW);
第一行为控件的处理保留内存。最后一行实际建立控件。如果晚一些时候或在一个单独
第 2 页
µC/GUI 中文手册
第 13 章 窗口对象(控件)
任务中 WM_Exec()被调用的话,控件会被视窗管理器自动绘出。
对于每一种控件来说,成员函数是有效的,通过它们允许修改控件的外观。一旦控件被
建立,它的特性可以通过调用一个它的成员函数来改变。这些函数以控件的句柄作为它们的
第一个参数。为了建立一个进度条,上面显示 45%,并将其颜色从默认值(深灰/浅灰)改为
绿/红,要使用到以下部分代码:
PROGBAR_SetBarColor(hProgBar, 0, GUI_GREEN);
PROGBAR_SetBarColor(hProgBar, 1, GUI_RED);
PROGBAR_SetValue(hProgBar, 45);
所有的控件也都有一个或多个配置宏,用于定义不同的默认设置,诸如字体和使用的颜
色等。在本章后面每个控件各自部分,对应的有效的配置选项都会列出来。
用于控件的动态存储器
在嵌入式应用当中,通常来说,使用动态存储器确实不是非常合适,因为存储残片效果
的缘故。有很多不同的方式可以用来这种情况,但是它们都工作在一个受限制的方式里,随
时内存区域都可能被应用程序中的一个指针引用。因为这个原因,µC/GUI 使用一个不同的方
法:所有物体(以及所有在运行时存储的数据)被存入一个句柄引用的内存区域当中。这会
使已分配好的内存区域在运行时重新分配成为可能。因而避免了使用指针时出现的长时间分
配的问题。所有控件因此通过句柄引用。
3D 支持
一些控件能够以 3D 或非 3D 效果显示。默认情况下是启用 3D 支持,但是也可能通过将配
置宏_USE_3D 设置为 0 而禁止它。不管它是否使用三维效果,一个控件的功能完全
一样的;唯一的不同是它的外观。下面是一个滑块控件的范例:
µC/GUI 中文手册
第 3 页
第 13 章 窗口对象(控件)
启用 3D 效果(默认)
禁止 3D 效果
13.2 通用控件 API 函数
API 参考:用于控件的 WM 函数
既然控件本质上是一个窗口,那么任何一种视窗管理器 API 函数都适用于它们。控件的
句柄作为 hWin 参数,控件象其它窗口一样处理。最普遍用于控件的 WM 函数在下表列出:
函数
说明
WM_DeleteWindow()
删除一个窗口。
WM_DisableMemdev()
禁止存储设备的重绘功能。
WM_EnableMemdev()
启用存储设备的重绘功能。
WM_InvalidateWindow()
使一个窗口无效。
WM_Paint()
立即绘制或重绘一个窗口。
对于全部与 WM 相关的函数目录,请参阅第 12 章:视窗管理器。
API 参考:所有控件共有的函数
下表按字母顺序列出了与控件相关的函数。这些函数适用于所有的控件。在此列出是为
了避免重复。函数的详细描述的后面给出。每个控件附加的成员函数在后面部分可以找到。
函数
说明
_CreateIndirect() 在对话框中自动创建时使用。
WM_EnableWindow()
将控件状态设置为启用(默认)。
WM_DisableWindow()
将控件状态设置为禁止。
_CreateIndirect()
描述
建立一个用于对话框中的控件。
函数原型
第 4 页
µC/GUI 中文手册
第 13 章 窗口对象(控件)
_Handle _CreateIndirect(
const GUI_WIDGET_CREATE_INFO*
pCreateInfo, WM_HWIN hParent,
int x0, int y0,
WM_CALLBACK* cb);
参 数
含 意
pCreateInfo 指向一个 GUI_WIDGET_CREATE_INFO 结构(下面提到)的指针。
hParent 父窗口的句柄。
x0
控件最左边的像素(桌面座标)。
附加信息
通过使用适当的前缀,任何控件都可能被间接的建立。
例如:BUTTON_CreateIndirect() 间接建立一个按钮控件,CHECKBOX_CreateIndirect()
间接建立一个复选框控件,等等。
如果一个控件包括在一个对话框当中,它只需要间接建立。否则,它可以通过使用
_Create()函数直接建立。更多关于对话框的信息,请参阅第 14 章:对话框。
资源表
对话框资源表中的 GUI_WIDGET_CREATE_INFO 结构定义如下:
typedef struct
{
const char* pName;
// 文本(不是所有的控件都使用)
I16 Id;
// 控件的窗口 ID
I16 x0, y0, xSize, ySize; // 控件的大小和位置
I16 Flags;
I32 Para;
// 控件专用标识(或 0)
// 控件专用参数(或 0)
} GUI WIDGET CREATE INFO;
GUI WIDGET CREATE FUNC* pfCreateIndirect;
// 创建函数
控件标识和参数是可选的,这非常依赖于控件的类型。每个控件的标识和参数(如果存
在)会在本章后面的适当部分列出。
µC/GUI 中文手册
第 5 页
第 13 章 窗口对象(控件)
WM_EnableWindow()
描述
将一个指定控件状态设置为激活(启用)。
函数原型
void WM_EnableWindow(WM_Handle hObj);
参 数
hObj
含 意
控件的句柄。
附加信息
对于任何控件来说,这是默认设置。
WM_DisableWindow()
描述
将一个指定的控件状态设置为非活动(无用)。
函数原型
void WM_DisableWindow(WM_Handle hObj);
参 数
hObj
含 意
控件的句柄。
附加信息
一个被禁止的控件以灰色显示,不会接收用户的输入。但其实际外观可以改变(根据 控
件/配置 的设置等等)
13.3 BUTTON:按钮控件
一般情况下,按钮控件作为触摸屏主要的用户接口部件使用。按钮可以显示文本,如下
面所示,或者一幅位图。
第 6 页
µC/GUI 中文手册
第 13 章 窗口对象(控件)
所有与按钮相关的函数仅次于文件 BUTTON* .c,BUTTON.h 当中。所有的标识是前
缀”BUTTON”。
配置选项
类型
宏
默认值
说明
N
BUTTON_3D_MOVE_X
N
BUTTON_3D_MOVE_Y
1
1
按下状态文本/位图在水平方向
偏移的像素数。
按下状态文本/位图在垂直方向
偏移的像素数。
N
N
S
N
N
B
BUTTON_BKCOLOR0_DEFAULT
0xAAAAAA 非按下状态的背景颜色。
BUTTON_BKCOLOR1_DEFAULT
GUI_WHITE 按下状态的背景颜色。
BUTTON_FONT_DEFAULT
&GUI_Font13_1 按钮文本的字体。
BUTTON_TEXTCOLOR0_DEFAULT
GUI_BLACK 非按下状态的文本颜色。
BUTTON_TEXTCOLOR1_DEFAULT
GUI_BLACK 按下状态的文本颜色。
BUTTON_USE_3D
1
启用3D效果支持。
默认状态下按钮按下时背景色是白色,是特意这样做的,因为这会使按钮按下时在任何
显示屏上显示得更明显些。如果你想让按钮的背景色无论是按下还是不按下的状态下都是一
样的,需将 BUTTON_BKCOLOR1_DEFAULT 改为 BUTTON_BKCOLOR0_DEFAULT 。
BUTTON API 函数
下表按字母顺序列出了µC/GUI 与按钮有关的函数,详细的描述在本章后面部分绘出。
函数
说明
BUTTON_Create()
建立按钮。
BUTTON_CreateAsChild()
将按钮作为一个子窗口建立。
BUTTON_CreateIndirect()
从资源表项目中建立按钮。
BUTTON_SetBitmap()
设置按钮显示时使用的位图。
BUTTON_SetBitmapEx()
设置按钮显示时使用的位图。
BUTTON_SetBkColor()
设置按钮的背景颜色。
BUTTON_SetFont()
BUTTON_SetState()
选择文本字体。
设置按钮状态(由触摸屏模块自动处理)。
BUTTON_SetStreamedBitmap()
设置按钮显示时使用的位图。
BUTTON_SetText()
设置文本。
BUTTON_SetTextColor()
设置文本的颜色。
µC/GUI 中文手册
第 7 页
第 13 章 窗口对象(控件)
BUTTON_Create()
描述
在一个指定位置,以指定的大小建立一个 BUTTON 控件。
函数原型
BUTTON_Handle BUTTON_Create(
int x0, int y0,
int xsize, int ysize,
int ID,
int Flags);
含 意
按钮最左边的像素(在桌面座标中)。
按钮最顶部的像素(在桌面座标中)。
参 数
x0
y0
xsize 按钮的水平尺寸(以像素为单位)。
ysize 按钮的垂直尺寸(以像素为单位)。
ID
按钮按下时返回的 ID。
Flags
窗口建立标识。具有代表性的,WM_CF_SHOW 是为了使
控 件 立 即 可 见 ( 请 参 阅 第 12 章 ” 视 窗 管 理 器” 中
WM_CreateWindow()的参数值列表)。
返回数值
所建立的按钮控件的句柄,如果函数执行失败,则返回 0。
BUTTON_CreateAsChild()
描述
以子窗口的形式建立一个按钮。
函数原型
BUTTON_Handle BUTTON_CreateAsChild( int x0, int y0,
int xsize, int ysize,
WM_HWIN hParent,
int ID,
第 8 页
µC/GUI 中文手册