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 函数。
现在回到主窗口的消息处理函数