发新话题
打印

eCGUI 驱动构造

eCGUI 驱动构造

Update2008-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核心源代码代码).

TOP

eCGUI 是个很容易移植的嵌入式图形用户界面系统,既能用TC2.0/BC3.1编译,运行在DOS16位模式下,又能用DJGPP编译运行在DOS32位模式下。
运行在Linux上,使用Framebuffer 作为显示驱动。我们花了很短的时间,就完成了到ARM平台的移植工作,顺利完成对了触摸屏的支持。

TOP

发新话题
最近访问的版块