分类: LINUX
2009-04-11 18:53:50
这里主要谈论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 画出「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的联机。