|
管理员
  
- 帖子
- 61
- 精华
- 0
- 积分
- 0
- 在线时间
- 54 小时
- 注册时间
- 2008-11-30
- 最后登录
- 2010-3-6
|
1#
大 中
小 发表于 2008-11-30 23:33 只看该作者
eCGUI 驱动构造
Update:2008-10-24
http://www.ecgui.com
http://www.ecgui.com/bbs
eCGUI输入/输出驱动分成三部分
(1).输出部分 out.c
输出部分主要是实现向屏幕等输出设备绘制图形界面,因为GUI是通过一些函数指针来调用这些函数。所以,输出设备是否真否真实存在是不重要,甚至可以把屏幕显示结果输出到文件里。
(2).输入部分 in.c
输入部分主要实现从键盘,鼠标等输入设备获得输入信息,GUI是通过一些函数指针来调用这些函数。所以输入部分函数,可以任意构造,可以是PC键盘,鼠标,也可以是触摸屏。甚至也可以从文件里读输入信息。利用这个特点,我们可以构造一些输入数据文件,构造输入驱动函数,从输入数据文件读取信息,来完成自动调试。
(3)注册驱动函数 init.c
注册驱动函数,将
输入/输出驱动函数注册到GUI中,来实现GUI驱动函数与GUI核心之间的连接。简单的说,就是填充一些结构。
(4)驱动测试 drv_test.c
例子中会包含一个drv_test.c 的文件,构造好驱动函数后,编译这个文件,才测试驱动是否正常工作。
(1).输出部分 out.c
typedef struct _TIMEINF
{
uint8 min;
uint8 hour;
uint8 hund;
uint8 sec;
}TIMEINF,*PTIMEINF;
|
TIMEINF是一个时间结构,在GUI主要用来处理
时钟,最直接的应用就是文本框中
光标的闪烁。
typedef struct _RECT
{
int left;
int top;
int right;
int bottom;
}RECT,*PRECT;
| RECT矩形结构
typedef struct _gui_dx
{
uint16 (*init)(struct BITMAP *map);
uint16 (*exit)(struct BITMAP *map);
void
(*putpixel)(struct BITMAP *map,int x,int y,uint32 color);
uint32 (*getpixel)(struct BITMAP *map,int x,int y);
void
(*line)(struct BITMAP *map,int x1,int y1,int x2,int y2);
void
(*rectangle)(struct BITMAP *map,int x1,int y1,int x2,int y2);
….. 在这里省略部分函数
int16
(*gettime)(PTIMEINF pt);
void
(*low_init)(void);
void
(*low_exit)(void);
void
(*low_event)(void);
struct BITMAP *mouse_map;
int
mx,my,mk;/* mouse */
}GUI_DX,*PGUI_DX;
| GUI_DX就是输出驱动函数的结构。BITMAP 是个图形结构,在后文会详细介绍。下面就介绍一下,GUI_DX结构中每个函数要实现的功能。
uint16(*init)(struct BITMAP *map);
实现图形的初始化,进入图形界面
其中包括对16个系统基本色,进行赋值。如在VGA16色(4位色):
G_COLORS[0]=0;
G_COLORS[1]=1;
G_COLORS[2]=2;
G_COLORS[3]=3;
G_COLORS[4]=4;
G_COLORS[5]=5;
G_COLORS[6]=6;
G_COLORS[7]=7;
G_COLORS[8]=8;
G_COLORS[9]=9;
G_COLORS[10]=10;
G_COLORS[11]=11;
G_COLORS[12]=12;
G_COLORS[13]=13;
G_COLORS[14]=14;
G_COLORS[15]=15;
如果是在256色(8位色)或者真彩色(16,24,32位色)的显示模式下,则直接需给出相应的值。
uint16(*exit)(struct BITMAP *map);
退出图形界面
void
(*putpixel)(struct BITMAP *map,int x,inty,uint32 color);
在(x,y)绘制一个像素
uint32(*getpixel)(struct BITMAP *map,int x,int y);
获得(x,y)处的像素
void
(*line)(struct BITMAP *map,int x1,int y1,intx2,int y2);
这个函数,可以为空
void
(*rectangle)(struct BITMAP *map,int x1,inty1,int x2,int y2);
这个函数,可以为空
void
(*bar)(struct BITMAP *map,int x1,int y1,intx2,int y2);
填充矩形,使用颜色为map->cur_color 。即BITMAP 结构中的cur_color变量。
void
(*setcolor)(struct BITMAP *map,uint32color);
设定使用颜色,即使 map->cur_color=color;
void
dj_setmode(struct BITMAP *map,uint32 mode);
设定模式
即使ap->cur_mode=mode;
void
(*bitblt)(struct BITMAP *dst,int dx,int dy,intwidth,int height,struct BITMAP *scr,int sx,int sy,int op);
Bitblt函数,功能同Windows 里的类似。
typedef struct BITMAP{
RECT rect;
void
*pData;
void
*pExtra;
int16 color_bit;
uint32 cur_color;
uint32 cur_mode;
PGUI_DX pDraw;
}BITMAP,*PBITMAP;
|
这个就是BITMAP 结构,pData 一般就数据区。
(2).输入部分 in.c
内容结构与 out.c 类似,请看附带的驱动例子。
MESSAGEmsg;
voidAddEvent(MESSAGE);
voiddj_event();
在这个函数里,检测键盘/鼠标等输入设备实践,然后调用
AddEvent 函数就可以了。
比如检测到鼠标按下左键
msg.tpye=GM_MOUSE;
msg.message=GM_LeftDown;
msg.icode=x;
msg.jcode=y;
AddEvent(&msg);
就完成一个事件的产生.
(3)注册驱动函数 init.c
请看附带的驱动例子。
GUI_DXGUI_DJ_DX;
PGUI_DX_low_drv_init(struct BITMAP *map)
{
GUI_DJ_DX.init=dj_init;
GUI_DJ_DX.exit=dj_exit;
GUI_DJ_DX.putpixel=dj_putpixel;
GUI_DJ_DX.getpixel=dj_getpixel;
GUI_DJ_DX.line=dj_line;
GUI_DJ_DX.bar=dj_bar;
GUI_DJ_DX.rectangle=dj_rectangle;
GUI_DJ_DX.setcolor=dj_setcolor;
GUI_DJ_DX.setmode=dj_setmode;
GUI_DJ_DX.bitblt=dj_bitblt;
GUI_DJ_DX.low_event=dj_event;
GUI_DJ_DX.gettime=dj_gettime;
map->pDraw=&GUI_DJ_DX;
return&GUI_DJ_DX;
}
(4)驱动测试 drv_test.c
编译drv_test.c 就可以了
--------------------
具体实例代码,请从 http://www.ecgui.com/html/ecgui/35.html 下载 eCGUI for Linux-x86 或者 for Linux-ARM .
其中的驱动层部分,就是提供源代码的。可以自行编译。(注:只有购买商业使用授权,才能获得eCGUI核心源代码代码).
|