免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1569 | 回复: 0
打印 上一主题 下一主题

Microwindow系列(一)--移植 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-05 19:09 |只看该作者 |倒序浏览

前段时间用microwindow开发了一个简单的手持机图形界面,近期利用闲暇之余,希望将自己的开发成果和心得一点一滴记录下来。对于打算用这套UI的朋友来说,基本是不推荐的,主要基于以下原因:
首先,一般的商业运用都会希望界面方面比较好看,以增加一些卖点,microwindow想做出比较花点的效果,都很困难。
其次,microwindow本身并无太多的控件,microwindow为开发者提供了两种API接口,一种是Nano-X API,它是正宗的microwindow的API接口,接口函数类似于GTK的API;另一种是microwindow API,这种接口极其类似于windows的WIN32 API接口(也是我选用的开发方式),其实它只是种模拟接口,最终还是调用nano-X的API实现的;对于这两种接口,nano-x API没有为用户提供一些界面的控件元素,只是提供了一些绘画函数,如果希望能够加入控件,还需要在移植microwindow的基础上,再移植一套开发工具包--FLNK;microwindow API提供了一些比较简单的控件,如按钮、列表框、进度条、静态框、文本框,但里面bug重重,很多消息处理都需要自己去写; 另外,microwindow对中文的支持也不大好,本地化移植也有点难;还好这一部分我做出来了,我用的是12*12点阵字体,后续会贴出来相应处的源码,朋友们可以拿去用。
最后一点,microwindow因为是免费的,所以没有技术支持,而且,网上资料也不多,还好源码是完全开放的,还是自己多下功夫分析源代码啦。
无疑,与免费的microwindow相比,免费的GTK更有优势,可以做出比较炫的效果,而且很稳定,资料也丰富;收费的QT可以做出最艺术的界面,它更多的倾向于用C++的人,而且对硬件要求要高一些。还有一个收费的miniGUI,免费的版本你基本不用考虑去用了,网站上有一个实例,做出来的效果感觉还不错。这些技术细节上的我就不清楚了,也不多谈。
Microwindow系列(一)--移植
(文:黄显国080505)
一、关于microwindow的移植
microwindow的更新可以用停滞来形容了,我们用这套GUI系统的原因是因为它的简单方便。
说实话,这段时间下来,很多看似方便的地方也真够折腾人的。先说说它的移植。
microwindow最新版本是0.91, 分带fonts库与不带fonts库的。汉字支持是需要用到fonts库。说到这里,一定要说说它的配置文件,配置文件分fb与X11两种,PC机上的用微桌面系统X11的配置,2410开发板上用到内核的frambuffer,当然选fb啦。可以直接修改config,也可以用make xconfig,如果里面选择了verbose,则能够看到详细的编译信息。这是我们所需要的,我们的文件都是通过编译器先生成.o,而后再链接形成可执行文件。
microwindow0.91的移植要看你配置的config啦,初手编译时可能会碰到很多错误,这些错误可以通过裁减相应的功能选项避免,也可以安装一些库,主要是字体库(freetype)和图片库(jpeg)支持,字体分矢量与点阵两种,矢量字体大小可变,点阵只支持12与16两种大小。可根据需要更改相应的lib路径, 比如字体路径可改为绝对路径。GB2312是常用点阵汉字库,简体中文要加入HZKFONT的支持,HZXFONT是繁体字库,BIG5是超大汉字库集。
二、本地中文化支持
用microwindow API的话,中文支持修改/mwin/wingdi.c, 将函数
HGDIOBJ WINAPI
GetStockObject(int nObject)
下面的一部分
  if(pObj->hdr.type == OBJ_FONT) {
   pFont = (MWFONTOBJ *)pObj;
   if(pFont->pfont == NULL) {
    pFont->pfont = GdCreateFont(&scrdev,
     pFont->name, 0, NULL);
    if (!pFont->pfont)
     pFont->pfont = GdCreateFont(&scrdev,
      NULL, 0, NULL);
   }
   return pObj;
  }
用下面一部分代码来替代
if(pObj->hdr.type == OBJ_FONT) {
   pFont = (MWFONTOBJ *)pObj;
   if(pFont->pfont == NULL) {
    memset(&mwlf,0,sizeof(mwlf));
    mwlf.lfHeight=12;
    mwlf.lfWidth=0;
    mwlf.lfEscapement=0;
    mwlf.lfOrientation=0;
    mwlf.lfWeight=0;
    mwlf.lfItalic=0;
    mwlf.lfUnderline=0;
    mwlf.lfStrikeOut=0;
    mwlf.lfCharSet=0;
    mwlf.lfOutPrecision=0;
    mwlf.lfClipPrecision=0;
    mwlf.lfQuality=0;
    strncpy(mwlf.lfFaceName,"HZKFONT",sizeof(mwlf.lfFaceName));
    family = (FF_DONTCARE|DEFAULT_PITCH) & 0xf0;
    switch(family) {
    case FF_DONTCARE:
     break;
    case FF_ROMAN:
     mwlf.lfRoman = 1;
     mwlf.lfSerif = 1;
     break;
    case FF_SWISS:
     mwlf.lfSansSerif = 1;
     break;
    case FF_MODERN:
     mwlf.lfModern = 1;
     break;
    }
    pitch = (FF_DONTCARE|DEFAULT_PITCH) & 0x0f;
    switch(pitch) {
    case DEFAULT_PITCH:
     break;
    case FIXED_PITCH:
    case MONO_FONT:
     mwlf.lfMonospace = 1;
     break;
    case VARIABLE_PITCH:
     mwlf.lfProportional = 1;
     break;
    }
    if (mwlf.lfWeight == FW_BOLD && mwlf.lfItalic)
     strcat(mwlf.lfFaceName, "z");
    else {
     if (mwlf.lfWeight == FW_BOLD)
      strcat(mwlf.lfFaceName, "b");
     if (mwlf.lfItalic)
      strcat(mwlf.lfFaceName, "i");
    }
   
    pFont->pfont = GdCreateFont(&scrdev,
         NULL, 0, &mwlf);
     if (!pFont->pfont)
      pFont->pfont = GdCreateFont(&scrdev,NULL, 0, NULL);
   }
   return pObj;
  }  
//注:Microwindow网站:
www.microwindow.org


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/66728/showart_674019.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP