第13章 窗口对象(控件)
控件是具有对象性质的窗口,在视窗世界中它们被称为控件,构造用户接口的元素。它
们能自动对某些事件起反应;例如,当一个按钮被按下时,它可能以不同的状态显示。控件
需要建立,具有能在它们存在的任何时间修改的特性,在它们不再需要时被删除。与窗口类
似,一个控件通过它的建立函数返回的句柄而引用。
控件需要使用视窗管理器。一旦一个控件被建立,它被处理成与其它窗口一样;WM 保
证它在需要的时候能正确的显示(及重绘)。当编写一个应用或一个用户接口时,控件并不需
要,但是它们能使编程更容易。
第 1 页
µC/GUI 中文手册
第 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 支持,但是也可能通过将配
置宏<WIDGET>_USE_3D 设置为 0 而禁止它。不管它是否使用三维效果,一个控件的功能完全
一样的;唯一的不同是它的外观。下面是一个滑块控件的范例:
第 3 页
µC/GUI 中文手册
第 13 章 窗口对象(控件)
启用 3D 效果(默认) 禁止 3D 效果
13.2 通用控件 API 函数
API 参考:用于控件的 WM 函数
既然控件本质上是一个窗口,那么任何一种视窗管理器 API 函数都适用于它们。控件的
句柄作为 hWin 参数,控件象其它窗口一样处理。最普遍用于控件的 WM 函数在下表列出:
函数 说明
WM_DeleteWindow() 删除一个窗口。
WM_DisableMemdev() 禁止存储设备的重绘功能。
WM_EnableMemdev() 启用存储设备的重绘功能。
WM_InvalidateWindow() 使一个窗口无效。
WM_Paint() 立即绘制或重绘一个窗口。
对于全部与 WM 相关的函数目录,请参阅第 12 章:视窗管理器。
API 参考:所有控件共有的函数
下表按字母顺序列出了与控件相关的函数。这些函数适用于所有的控件。在此列出是为
了避免重复。函数的详细描述的后面给出。每个控件附加的成员函数在后面部分可以找到。
函数 说明
<WIDGET>_CreateIndirect() 在对话框中自动创建时使用。
WM_EnableWindow() 将控件状态设置为启用(默认)。
WM_DisableWindow() 将控件状态设置为禁止。
<WIDGET>_CreateIndirect()
描述
建立一个用于对话框中的控件。
函数原型
第 4 页
µC/GUI 中文手册
第 13 章 窗口对象(控件)
<WIDGET>_Handle <WIDGET>_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()
间接建立一个复选框控件,等等。
如果一个控件包括在一个对话框当中,它只需要间接建立。否则,它可以通过使用
<WIDGET>_Create()函数直接建立。更多关于对话框的信息,请参阅第 14 章:对话框。
资源表
对话框资源表中的 GUI_WIDGET_CREATE_INFO 结构定义如下:
typedef struct
{
const char* pName; // 文本(不是所有的控件都使用)
I16 Id; // 控件的窗口 ID
I16 x0, y0, xSize, ySize; // 控件的大小和位置
I16 Flags; // 控件专用标识(或 0)
I32 Para; // 控件专用参数(或 0)
} GUI WIDGET CREATE INFO;
GUI WIDGET CREATE FUNC* pfCreateIndirect; // 创建函数
控件标识和参数是可选的,这非常依赖于控件的类型。每个控件的标识和参数(如果存
在)会在本章后面的适当部分列出。
第 5 页
µC/GUI 中文手册
- 1
- 2
前往页