标题:[原创]Space C <C语言开发工具> 的控件设计
只看楼主
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
结帖率:100%
 问题点数:0 回复次数:5 
[原创]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]]
搜索更多相关主题的帖子: Space 控件 C语言 工具 IDE 
2008-02-17 02:41
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 
没办法,自顶一个

个人网站 -  http://.h001.
2008-02-17 02:54
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 
不错,自己用C制作控件原来是这样的喔。就是把控件的特性全部描述出来,把事件也定义到结构体中。那么如何执行事件函数呢?

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2008-02-17 14:21
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 
其实很简单啊,我们定义了事件函数指针,
然后编写适当事件函数,并用事件函数指针指向事件函数。

那么在一些主体函数里面调用定义的事件函数指针,我们的事件函数就可以被执行

那为什么要怎么做?
1。这样我的事件函数的函数名可以由用户指定,他一般是和控件名称对应的。
比如你加的按钮控件,你把他取名为 "SP_Button_Muself"

那么此控件的事件函数:比如Click,就会被命名为 SP_Button_Muself_Click();

以上是我们自己动手裸写代码的工程,而现在这些工作Space C全为你做了。大家可以用Space C实际的动手操作一下就可以看到效果

2.这样做速度快。Space C控件在对事件的处理,初了函数指针的方式外还有纯粹的添加函数的方式。大家可以在帮助文挡中看到详细的解释。你也可以自己编写个事件为添加函数的按钮控件。并做做对比,会发现此种方式比较慢。

欢迎,并希望有兴趣的朋友可以仔细的研究以下SPace C的用法,我相信他可以激发出你很多的创造力

个人网站 -  http://.h001.
2008-02-17 17:12
QQ22727652
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-3-22
得分:0 
怎么下载?
2008-03-23 18:44
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 
Space C 1.0.1.2 开发工具下栽
https://bbs.bccn.net/thread-203491-1-1.html


列表框控件 1.0:  - 2008.3.18
按钮控件 1.2: - 2008.3.20
时钟控件 1.2: - 2008.3.20
菜单控件 1.2: - 2008.3.20
ComboBox 1.0: - 2008.3.21

这些控件下载,安装上就是了。(安装过程看帮助文档,很简单,在“控件管理”菜单里面)

https://bbs.bccn.net/thread-203942-1-1.html

个人网站 -  http://.h001.
2008-03-23 22:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-200124-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023749 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved