[原创]Space C <C语言开发工具> 的控件设计
今天遇到个朋友,用了Space C觉得还可以,但却一直认为Sapce C中的控件是死板和总体软件固定在一起的。所以,想发个贴在说明一下。其实Space C的控件是和IDE完全脱离的,是可以的独立编写的。
也就是说,各位朋友要有兴趣完全可以自己编写任何控件。当然,你更可以自己确定一个框架,并编写你自己使用的平台下特点的控件。
也就是说,Space C实际上是个“代码添加器”,他只是可以按照你事先设定好的规则为你添加代码。
既然这样,也就意味着,即使你是在嵌入试的ARM扳子上也可以利用Space C开发。
我在贴个“按钮控件”的制作过程出来,希望有兴趣的朋友能够参与进来。
也许当初自己开发的控件数量少,让很多初看Space C的朋友没兴趣,或觉得不知所云。呵呵,抱歉啊。
我以为大家会对他感兴趣的。。。。。。
不过,我个人就是希望借助大家的力量把他丰富起来,这样这个东西才有生命力
下面我把帮助文档中的“按钮控件”的制作过程贴出来:
控件的编写
PXE 控件是 Spcae C 的关键所在,然而‘控件’一词只是借用了其概念,他的实质就是一组配置文件。您可以这样认为 Space C 的IDE就是解析 PXE 控件,按照 PXE 控件的描述规则去添加代码。下面将通过制作按钮控件的例子来说明 PXE 控件的编写过程。需要大家注意的是:只有在完全了解了 Space C 所以产生代码的主体架构后,才能随心所欲的开发出 PXE 控件,所以请仔细查阅“Space C 解秘”的相关内容。
点击主界面 组件->设计控件,将出现如下图3.0控件设计主界面:
3.0 控件设计主界面
我们即将来制作一个按钮控件,首先让我们来看看此按钮的数据结构(注意:为了实现‘控件’形式,用户编写的‘控件’模块必定是多个函数对某个数据结构的操作)
typedef struct
{
UINT8 *Name; /* 按钮名称 */
UINT8 Enable; /* 按钮是否可操作 */
UINT8 Visible; /* 按钮是否可见 */
UINT16 TabOrder; /* 按钮的顺序 */
UINT8 TabKey; /* 标记是否已显示焦点选中 */
INT16 OldX; /* 记录鼠标当前位置 */
INT16 OldY;
INT16 Left; /* 按钮在屏幕的坐标 */
INT16 Top;
UINT16 Width; /* 按钮的宽高 */
UINT16 Height;
SPCOLOR Color1; /* 按钮边框和中间的颜色 */
SPCOLOR Color2;
SPCOLOR Color3;
SPCOLOR Color4;
UINT8 *Caption; /* 按钮名称 */
UINT16 Keyboard; /* 快捷键值 */
} SPBUTTON;
接着看看对应此数据结构操作的函数:
void SP_CreatButton(SPBUTTON *Button,
UINT8 *Name,
INT16 Top,
INT16 Left,
UINT16 Width,
UINT16 Height,
UINT8 Enable,
UINT8 Visible,
UINT16 TabOrder,
UINT8 TabKey,
SPCOLOR Color1,
SPCOLOR Color2,
SPCOLOR Color3,
SPCOLOR Color4,
UINT8 *Caption,
UINT16 Keyboard); /* 按钮赋值函数,加在主循环之前 */ -★
INT16 SP_UseButton(SPBUTTON *Button, UINT16 TabOrder, UINT16 Keyboard); /* 控件使用函数,加在主循环中 */ -★
void SP_ScareteButton(SPBUTTON Button); /* 隐藏按钮 */
void SP_RevealButton(SPBUTTON Button); /* 重显按钮 */
void SP_ButtonClick(SPBUTTON *SPControl, UINT16 X, UINT16 Y); /* 鼠标点击事件统一入口 */ -●
void SP_MouseMove(SPBUTTON *SPControl, UINT16 X, UINT16 Y); /* 鼠标移动事件统一入口 */ -●
具体的操作步骤:
1.填写“基本信息”
2.创建控件
3.属性
4.事件
a.事件方式 - 函数添加
b.事件方式 - 函数指针
5.函数原型
6.帮助信息
7.生成控件
1.填写“基本信息”
看到图3.0中的“基本信息”框,填写如下图3.1所示:
图3.1 基本信息填写框
控件数据类型:即填写数据结构名。(长度为8字节)
自动命名名称:即您希望Space C在开辟此类控件时创建的名称。如上,若用户在添加此按钮控件时Space C将自动添加
SPUTTON SP_Button1;声明。当然若添加多个将自动更改其后的数字。
浏览:将添加此控件的图标样式。此图标样式只在Space C的对象列表区显示。
控件类型 拖动:将决定您制作的控件在Space C上的绘制时是否是可拖动的。(为什么要这有这样的选项?比如您制作的控件是没有
皮肤表现的,那么您可以将此选项勾掉)
注意:“控件数据类型”必须采用独特的名字,要避免与其他控件相同。为什么?在一个工程里面总不可能有两个数据结构都用同一个类型名命名吧。那为什么只有8字节?哦,这个是历史遗留问题。因为生成的控件会以“SPUTTON.H”来命名头文件,而Space C默认采用TC做为编译器,而他只支持8.3格式短文件名。如上,生成的控件名将为 “SPBUTTON.pxe”。还有,生成控件后不能手动更改控件名,这样Space C将认为是非法PXE控件,不给予支持。
2.创建控件
填写好基本信息,请点击“创建控件”为你的控件指定一个生成路径。这样在你指定的路径下将生成一个以数据类型命名的文件夹。如上所举例,将生成一个“SPBUTTON”文件夹,如下图3.2顶部所示:
图3.2 创建路径
3.属性
接下来我们将填写好属性并加载头文件,如下图3.3所示:
图3.3 属性编写
添加头文件:在代码编辑框添加头文件内容。注意:头文件最好只有数据结构和函数声明。
函数名称:首先在此填写初始化函数名,如上“SP_CreatButton”。右边将显示“初始化函数效果”。此函数即此文开始处带“★”
号的函数,其作用是完成控件的初始化,当然其具体内容必须用户自己编写。此函数将被自动加载在主循环的前端。还
有,可以看到“头文件名”显示“SPBUTTON.h”。
控件传值:决定初始化函数在传入控件时以何形式,这主要看您的数据结构是否是以结构指针开辟控件的。具体请看“初始化函数效
果”。
属性名称:在此填写相关属性,可增加或删除。其中 *Name - &Height 5项属性是既定有的,当然在用户自己控件的数据结构中除了
Name属性(因为Name属性记录了开辟的控件名称,必不可少),其他几项可以不具备。但是初始化函数的参数形式必须留
有这几项。注意:在填写属性的时候必须是 &Value 或 *Value,其中 & 表示其属性是一个整数值, * 表示其属性是字符
串。具体请看“初始化函数效果”。
可视化过程绘制样式:决定控件在被绘制过程的表现形式。
4.事件
事件有两种类型,强烈建议若无特殊需要请选择 b.函数指针。
a.事件方式 - 函数添加
我们再看到编写事件和添加 *.C 文件,如下图3.4:
图3.4 事件编写
添加C文件:在代码编辑框添加C文件内容。注意:C文件最好只是要使用的外部变量和具体函数实现。
入口函数:添加循环入口函数,如上“SP_UseButton”。右边将显示“函数效果”。此函数即此文开始处带“★”号的函数,起作用
是控件工作的入口。此函数被自动加载在主循环中,他的格式是固定,并一定是 int 类型的函数,如此例:
INT16 SP_UseButton(SPBUTTON *Button, UINT16 TabOrder, UINT16 Keyboard);
还有,可以看到“C文件名”显示“SPBUTTON.c”。
控件传值:决定入口函数在传入控件时以何形式,这主要看您的数据结构是否是以结构指针开辟控件的。具体请看“函数效果”。
事件函数:此函数为控件所拥有的事件同一入口,下面我们以增加“Click”事件为例加以说明,如图3.5所示:
图3.5 添加事件
1.在“时间函数”中填写“Click(X, Y);”并增加。(注意:其形式要完整,注意各提示信息)
2.在代码编辑框中找到需要添加其事件的位置,并点击其行号。如上可以看到“函数标识添加位置”显示“264”。这表示此事件
函数将被添加再此位置。
3.在主体函数引出事件的统一入口函数,如上的“SP_ButtonClick()”函数。(注意:这里强调的是此入口函数必须传入控件变
量,如上所示的“SPBUTTON *SPControl”,并且其变量名必须为“SPControl”。因为Space C是以控件的 Name 来判断当前应
该添加何种代码,具体请查阅“Space C 解秘”)
4.在事件列表框选中“Click(X, Y);”并右键将弹出菜单。点击“生成函数标识”将在上面提到的 264 行自动添加一标识。如上
图所示的“/*$@-SpaceAddFun Click-@$*/”就是其效果。(注意:此标识很重要,在函数添加方式下Space C就是依靠此类标
识找到代码添加的正确位置)
b.事件方式 - 函数指针
其中事件方式是以函数指针指向事件函数,这需要我们在自己的数据结构包含函数指针,所以前文提到的数据结构应做如下更改:
typedef void (*SPBUTTON_ClickAndMove)(UINT16, UINT16);
typedef struct
{
UINT8 *Name; /* 按钮名称 */
UINT8 Enable; /* 按钮是否可操作 */
UINT8 Visible; /* 按钮是否可见 */
UINT16 TabOrder; /* 按钮的顺序 */
UINT8 TabKey; /* 标记是否已显示焦点选中 */
INT16 OldX; /* 记录鼠标当前位置 */
INT16 OldY;
INT16 Left; /* 按钮在屏幕的坐标 */
INT16 Top;
UINT16 Width; /* 按钮的宽高 */
UINT16 Height;
SPCOLOR Color1; /* 按钮边框和中间的颜色 */
SPCOLOR Color2;
SPCOLOR Color3;
SPCOLOR Color4;
UINT8 *Caption; /* 按钮名称 */
UINT16 Keyboard; /* 快捷键值 */
SPBUTTON_ClickAndMove Click; /* 点击事件函数指针 */
SPBUTTON_ClickAndMove MouseMove;/* 鼠标移动函数指针 */
} SPBUTTON;
接着看看对应此数据结构操作的函数:
void SP_CreatButton(SPBUTTON *Button,
UINT8 *Name,
INT16 Top,
INT16 Left,
UINT16 Width,
UINT16 Height,
UINT8 Enable,
UINT8 Visible,
UINT16 TabOrder,
UINT8 TabKey,
SPCOLOR Color1,
SPCOLOR Color2,
SPCOLOR Color3,
SPCOLOR Color4,
UINT8 *Caption,
UINT16 Keyboard); /* 按钮赋值函数,加在主循环之前 */ -★2
INT16 SP_UseButton(SPBUTTON *Button, UINT16 TabOrder, UINT16 Keyboard); /* 控件使用函数,加在主循环中 */ -★2
void SP_ScareteButton(SPBUTTON Button); /* 隐藏按钮 */
void SP_RevealButton(SPBUTTON Button); /* 重显按钮 */
其与 a.函数添加 主要就是在事件函数的添加方式不同,下面我们也以“Click”事件为例加以说明,如图3.5~所示
图3.5~ 添加事件
1.将“事件方式 函数指针”勾上。
2.在“时间函数”中填写“Click(X, Y);.Click”并增加。(注意:其形式要完整,也可以是“Click(X, Y);->Click”这要看您
的控件是以什么形式开辟的。注意各提示信息)
只需做此2步即可。大家可以看到此方式比 a.函数添加 要简单。那他的工作方式也很简单,如上方式在实际开发过程中他将自
动添加代码“Button.Click = 事件函数名”。
此方式最大的好处就是免去了大量函数调用,而采用直接的函数指针指定,这样程序整体表现将更快。(推荐使用)
5.函数原型
最后我们为已添加的事件函数添加对应的函数原型声明,如图3.6所示:
图3.6 添加函数原型声明
函数原型:在左边的时间函数列表中选中要更改的函数,并在“函数原型”中填写函数原型声明,其效果会在右边的函数原型声
明列表表现出来。(注意:其形式要完整,即'('、')'、';'等不能少)
6.帮助信息
此为控件的相关帮助信息,由控件作者编写,目的在于帮助用户了解掌握控件的使用方法。以此列帮助信息如图3.7所示:
图3.7 控件帮助信息
7.生成控件
完成以上工作,点击“生成控件”将在您指定的目录下生成控件。效果如图3.8:
图3.8 生成控件
如何制作 PXE 控件介绍完毕。我相信以上内容还是很简单易懂的。我相信可能最让人感到迷茫的是步骤4-事件的添加。而此需要您对Space C产生代码的主架构完全了解后才能很好的理解,所以建议您仔细查阅“Space C 解秘”。
[[it] 本帖最后由 jig 于 2008-2-17 02:46 编辑 [/it]]