发新话题
打印

X-Editor on eCGUI

X-Editor on eCGUI

X-Editor 文本编辑器
设计实现
版权所有:http://www.ecgui.com
下载: http://www.ecgui.com/download/xedit.zip
最后更新日期:2007-7-23

设计目标
简单可用的文本编辑器

实现
基于微型嵌入式GUI,利用提供的GUI控件和API完成相应的功能。
效果预览

基本功能实现:

新建文件(New File),打开文件(Open File),保存文件(Save File)。



使用的控件:

(1)               EDITBOX

(2)               BUTTON



实现思路:

创建对象,完成基本界面。将三个按钮分别定义为

NEW_BUTTON 新建文件按钮

OPEN_BUTTON 打开文件按钮

SAVE_BUTTON 保存文件按钮

处理 NEW_BUTTON.

如果有文本改动,创建对话窗口,询问是否保存文件。

如果选择保存,判断当前文件名称,如果没有指定,创建对话窗口,获得文件名,并保存。清空当前文本,并将默认文件名设置为NULL.

如果选择不保存,清空当前文本, 并将默认文件名设置为NULL.
图形描述

处理 OPEN_BUTTON
如果当前编辑文本有改动,创建对话窗口,询问是否保存文件。
如果选择保存,判断当前文件名称,如果没有指定,创建对话窗口,获得文件名,并保存。清空当前文本,并将默认文件名设置为NULL.
如果选择不保存,清空当前文本, 并将默认文件名设置为NULL.
创建对话窗口,获得需要打开的文件名,并将文件内容导入到文本编辑框中,默认文件名设置为打开的文件名。

处理 SAVE_BUTTON
判断当前默认文件名。如果为NULL,创建对话窗口,获得需要保存的文件名。
将文本编辑框中的内容到出到文件。

开发:

创建编辑框和按钮对象,完成基本界面。

- 1.c -

#include "gui.h"



#define NEW_BUTTON 1

#define OPEN_BUTTON 2

#define SAVE_BUTTON 3



USER_PRO MainWin(HAND hd,MESSAGE msg)

{

if(msg.type == GM_SYSTEM)

switch(msg.message)

{

case GM_Create:

CreateObject(hd,EDITBOX,1,1,"",5,70,630,440,0,0);

CreateObject(hd,BUTTON,NEW_BUTTON,3,"New",5,25,45,65,0,0);

CreateObject(hd,BUTTON,OPEN_BUTTON,3,"Open",50,25,95,65,0,0);

CreateObject(hd,BUTTON,SAVE_BUTTON,3,"Save",100,25,140,65,0,0);

return;

default:return;

}

}



int gmain(void*data)

{

CreateObject(0,MAINWINDOW,1,1,"X-Editor0.0.1 www.ecurb2006.com",0,0,640,480,MainWin,data);

return 0;

}



为了方便窗口与个对象之间的交互,我们可以构建一个数据结构,来保存对象的句柄和其他信息。



typedef struct _MyWin

{

HAND NewButton;

HAND OpenButton;

HAND SaveButton;

HAND EditBox;

char file[256];/* 文件名 */

char change;/* 文本是否改变 */

}MyWin,*PMyWin;

设定窗口的自定义数据,保存个对象的句柄,并完成对象销毁时数据的销毁工作。

-        2.c –

#include "gui.h"



#define NEW_BUTTON 1

#define OPEN_BUTTON 2

#define SAVE_BUTTON 3



typedef struct _MyWin

{

HAND NewButton;

HAND OpenButton;

HAND SaveButton;

HAND EditBox;

char change;

char file[256];

}MyWin,*PMyWin;



USER_PRO MainWin(HAND hd,MESSAGE msg)

{

PMyWin pMyWin; /* 自定义数据指针 */

if(msg.type == GM_SYSTEM)

    switch(msg.message)

    {

    case GM_Create:

        /* 动态分配内存 */

        pMyWin=(PMyWin)Gmalloc(sizeof(MyWin),"");

/* 保存对象句柄 */

pMyWin->EditBox=CreateObject(hd,EDITBOX,1,1,"",5,70,630,440,0,0);

pMyWin->NewButton=CreateObject(hd,BUTTON,NEW_BUTTON,3,"New",5,25,45,65,0,0);

      pMyWin->OpenButton=CreateObject(hd,BUTTON,OPEN_BUTTON,3,"Open",50,25,95,65,0,0);

      pMyWin->SaveButton=CreateObject(hd,BUTTON,SAVE_BUTTON,3,"Save",100,25,140,65,0,0);

/* 设定对象的自定义数据 */

       SetObjVar(hd,(HAND)pMyWin);

     

    return;



    case GM_Destroy:/* 对象销毁时,产生该消息 */

         {

       HAND var;

       var=GetObjVar(hd);/* 获得对象的自定义数据 句柄*/

       Gfree(var,sizeof(MyWin));/* 释放数据占用的内存空间 */

       }

    return;



    default:return;

    }

}



int gmain(void*data)

{

CreateObject(0,MAINWINDOW,1,1,"X-Editor 0.0.1 www.ecurb2006.com",0,0,640,480,MainWin,data);

return 0;

}





局部实现

判断文本改变



if(msg.type == GM_CTRL && GM_TextChange)

    {

    pMyWin->change=True;

    return;

    }


判断 文本编辑改动,是否保存文件?

   if(pMyWin->change == True)

      {

efDialogWin->Start(hd,1,1,"X-Editor",100,100,360,200,Dialog_New,0);

      return;

      }



使用efDialogWin->Start 启动对话窗口后,窗口并不会立即启动,而是向GUI发出了创建对话窗口的申请。



确认选择保存文件(对话窗口消息处理函数 -Dialoa_New- 中部分)

f(msg.type == GM_COMMAND)

  switch(msg.message)

  {

  case 1:/* 1为 OK 按钮的 ID */

       if(*pMyWin->file == 0)

       SendMessage(GetObjHost(hd),GM_POST,GP_SAVE_NAME,0,0,0);

       else SendMessage(GetObjHost(hd),GM_POST,GP_SAVE_FILE,0,0,0);

       efDialogWin->Quit(hd);

return;



因为不建议在对话窗口里,对主窗口的对象进行操作,如文本内容的改变。所以这里使用 SendMessage 函数向 主窗口传送消息。

确认后,就可以结束对话窗口,使用 efDialogWin->Quit 函数。



现在回到主窗口的消息处理函数
附件: 您所在的用户组无法下载或查看附件

TOP

发新话题
最近访问的版块