Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37913
  • 博文数量: 13
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 158
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-05 19:31
文章分类

全部博文(13)

文章存档

2011年(1)

2009年(12)

我的朋友

分类: LINUX

2009-04-11 18:53:50

 
 
目前流行的嵌入式图形系统具有代表性的有三个,一是Embedded Qt, 由挪威TrollTech 公司出品, 其由C++来现实。 二是miniGUI,由国内飞慢软件公司开发。 三是Microwindow.

这里主要谈论Microwindow, 先做个简单的介绍,Nano-X 是Century Software的开放源代码项目,以前叫做MicroWindows, 因为和Microsoft的注册商标有冲突,于2005年1月30日更名为Nano-X Windows。 它设计用于带小型显示单元的微型设备,它有许多针对现代图形视窗环境的功能部件。像X一样,有多种平台支持。Nano-X Window体系结构是基于客户机/服务器(Client/Server)的。 它具有分层设计: 最底层是屏幕幕和输入设备驱动程序(键盘或鼠标)来与实际硬件交互。在中间层,可移植的图形引擎提供对线的绘制、区域的填充、多边形、裁剪以及颜色模型的支持。在最上层,Nano-X Window支持两种API: Win32/WinCEAPI和类Xlib(也叫Nano-X)的API。Nano-X用在Linux上,用于占用资源少的应用程序.

Nano-X Window支持1、2、4和8 bpp(每像素的位数)的衬底显示,以及8、16、24和32 bpp的真彩色显示。Nano-X Window还支持便它速度更快的帧缓冲区。Nano-X服务器占用的资源大约在100KB到150KB。原始Nano-X应用程序的平均大小在30KB到60KB。由于Nano-X是为有内存限制的低端设备设计的,所以它不像X那样支持很多函数,因此它实际上不能做为微型X(Xfree4.5)的替代品。
学习任何一套程式库(application framework)绝不应是“函数导向”的方式,即不要把学习重点放在学习一个一个函数的使用上,而应采用“主题导向”,即从其的范例程序开始,分析其中每一条代码的实现功能,以及其在整个程序中的作用。基于这种学习思路,我们先从经典的“hello world”程序的源码开始学习。
学习之前应该准备以下资料,并先浏览一下:
microwindows/nano-X体系结构:
文件: Microwindows体系结构.pdf
大小: 160KB
下载: 下载
nano-X编程指南:
文件: Nano-X 编程指南.pdf
大小: 337KB
下载: 下载
 
 
nano-X的API及数据结构参考手册(以HTML形式给出,方便查找)
文件: nano-X API.rar
大小: 87KB
下载: 下载

#include <stdio.h>
#include <microwin/nano-X.h>

GR_WINDOW_ID wid;
GR_GC_ID gc;

void event_handler (GR_EVENT *event);

int main (void)
{
   if (GrOpen() < 0) {
        fprintf (stderr, "GrOpen failed");
        exit (1);
    }

   gc = GrNewGC();
   GrSetGCForeground (gc, 0xFF0000);

   wid = GrNewWindowEx(GR_WM_PROPS_APPFRAME |
                       GR_WM_PROPS_CAPTION |
                       GR_WM_PROPS_CLOSEBOX,
                       "jollen.org",
                       GR_ROOT_WINDOW_ID,
                       0, 0, 200, 200, 0xFFFFFF);

   GrSelectEvents(wid, GR_EVENT_MASK_CLOSE_REQ | GR_EVENT_MASK_EXPOSURE);

   GrMapWindow(wid);
   GrMainLoop(event_handler);
}

void event_handler (GR_EVENT *event)
{
   switch (event->type)
   {
      case GR_EVENT_TYPE_EXPOSURE:
           GrText(wid, gc, 50, 50, "Hello World", -1, GR_TFASCII);
    break;
      case GR_EVENT_TYPE_CLOSE_REQ:
    GrClose();
           exit (0);
      default: break;
   }
}

 

观念的强化
了解怎么使用 Nano-X 画出「Hello World」后,我们挑出几个重要的观念来做加强:
1. GC(Graphics Context)
在 Nano-X 系统里,我们可以把 GC 视为一张画布,透过 Nano-X 的函数我们就可以在 GC 上绘图。呼叫 GrNewGC() 函数可以建立一个 GC,若 GC 建立成功,则 Nano-X server 会传回一个 GC 的 ID。我们会在程序一开始的时间就建立一个 GC,程序除了可以在 GC 上绘图外,GC 的数据也能复制或透过选取函数(selection)做区域处理。
2. 窗口(windows)
Nano-X 的窗口是在程序一开始时呼叫 GrNewWindow() 函数所建立,若建立成功则可以取得 Window ID。窗口当然具备边框(border)与按钮等各种窗口属性,窗口属性可以在窗口建立时指定,或是透过 window manager 做修改。


Nano-X 程序设计流程
以下归纳出 Nano-X 程序设计的步骤:
1、初始化与 server 的联机。呼叫 GrOpen() 函数,若传回小于 0 的值,表示无法与 Nano-X server 联机。程序写法如下:
if (GrOpen() < 0) {
   fprintf (stderr, "GrOpen failed");
   return -1;
}
2、建立新的 GC:
GR_GC_ID gc;
gc = GrNewGC();
若执行成功则传回 GC 的 ID,其数据型别为 GR_GC_ID。
3、设定 GC 的前景色:
GrSetGCForeground (gc, 0xFF0000);
指定 GC 的 ID 并设定其前景色。
4、呼叫 GrNewWindowEx() 函数建立新窗口:
GR_WINDOW_ID wid;
wid = GrNewWindowEx(GR_WM_PROPS_APPFRAME |
   GR_WM_PROPS_CAPTION |
   GR_WM_PROPS_CLOSEBOX,
   "jollen.org",
   GR_ROOT_WINDOW_ID,
   0, 0, 200, 200, 0xFFFFFF);
5、选取事件。呼叫 GrSelectEvents() 函数选择我们想要处理的事件:
GrSelectEvents(wid, GR_EVENT_MASK_CLOSE_REQ | GR_EVENT_MASK_EXPOSURE);
以 hello.c 为例,表示我们想要处理窗口关闭请求(GR_EVENT_MASK_CLOSE_REQ)与窗口显示(GR_EVENT_MASK_EXPOSURE)事件。
6、呼叫 GrMapWindow() 函数显示窗口,并产生 GR_EVENT_MASK_EXPOSURE 事件:
GrMapWindow(wid);
7、呼叫 GrMainLoop() 函数进入 Nano-X 的分派循环:
GrMainLoop(event_handler);
传递给 GrMainLoop() 函数的参数为函数指针,指向处理事件的函数(event handler)。在分派循环里,若产生我们所指定的事件时就会呼叫事件处理函数,因此我们必须在事件处理函数做事件处理。

事件(Event)处理
在分派循环里,产生我们所指定的事件时,就会呼叫事件处理函数。以下是 hello.c 的事件处理函数:
void event_handler(GR_EVENT *event)
{
   switch(event->type)
   {
      case GR_EVENT_TYPE_EXPOSURE:
              GrText(wid, gc, 50, 50, "Hello World", -1, GR_TFASCII);
              break;
      case GR_EVENT_TYPE_CLOSE_REQ:
              GrClose();
      default: break;
   }
}
分派循环会传递一个事件讯息的指针给事件处理函数,即程序中的event变量。我们可透过此变量来判断所产生的事件,并做出相对应的处理:
• GR_EVENT_TYPE_EXPOSURE:窗口出现后产生此事件,我们在此事件产生后呼叫 GrText() 函数在画面上显示文字。
• GR_EVENT_TYPE_CLOSE_REQ:当窗口关闭的请求发生时,则产生此事件。我们在此事件产生后呼叫 GrClose() 函数关闭与nano-X server的联机。

阅读(2505) | 评论(2) | 转发(1) |
1

上一篇:没有了

下一篇:基于nanowm定制自已的窗体任务管理器

给主人留下些什么吧!~~

辉捺天韵2013-09-24 00:11:55

非常感谢博主的文章啊,我只想说谢谢

chinaunix网友2010-03-19 15:24:17

强人。