- 论坛徽章:
- 0
|
前段时间用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 |
|