Microwindow系列(1)--移植

前段时间用microwindow开发了一个简单的手持设备图形界面,近期利用闲暇之余,希望将自己的开发成果和心得一点一滴记录下来。对于打算用这套UI的朋友来说,基本是不推荐的,主要基于以下原因:
 首先,一般的商业运用都会希望界面方面比较好看,以增加一些卖点,microwindow想做出比较花点的效果,都很困难。
 其次,microwindow本身并无太多的控件,microwindow为开发者提供了两种API接口,一种是Nano-XAPI,它是正宗的microwindow的API接口,接口函数类似于GTK的API;另一种是microwindowAPI,这种接口极其类似于windows的WIN32API接口(也是我选用的开发方式),其实它只是种模拟接口,最终还是调用nano-X的API实现的;对于这两种接口,nano-xAPI没有为用户提供一些界面的控件元素,只是提供了一些绘画函数,如果希望能够加入控件,还需要在移植microwindow的基础上,再移植一套开发工具包--FLNK;microwindowAPI提供了一些比较简单的控件,如按钮、列表框、进度条、静态框、文本框,但里面bug重重,很多消息处理都需要自己去写; 另外,microwindow对中文的支持也不大好,本地化移植也有点难;还好这一部分我做出来了,我用的是12*12点阵字体,后续会贴出来相应处的源码,朋友们可以拿去用。
 最后一点,microwindow因为是免费的,所以没有技术支持,而且,网上资料也不多,还好源码是完全开放的,还是自己多下功夫分析源代码啦。
 无疑,与免费的microwindow相比,免费的GTK更有优势,可以做出比较炫的效果,而且很稳定,资料也丰富;收费的QT可以做出最艺术的界面,它更多的倾向于用C++的人,而且对硬件要求要高一些。还有一个收费的miniGUI,免费的版本你基本不用考虑去用了,网站上有一个实例,做出来的效果感觉还不错。这些技术细节上的我就不清楚了,也不多谈。
Microwindow系列(一)--移植

一、关于microwindow的移植
 microwindow的更新可以用停滞来形容了,我们用这套GUI系统的原因是因为它的简单方便。
说实话,这段时间下来,很多看似方便的地方也真够折腾人的。先说说它的移植。
 microwindow最新版本是0.91,分带fonts库与不带fonts库的。汉字支持是需要用到fonts库。说到这里,一定要说说它的配置文件,配置文件分fb与X11两种,PC机上的用微桌面系统X11的配置,2410开发板上用到内核的frambuffer,当然选fb啦。可以直接修改config,也可以用makexconfig,如果里面选择了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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值