在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 52605|回复: 93

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

[复制链接]
发表于 2005-6-8 20:46:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
[这个贴子最后由ucgui在 2005/06/27 10:04am 第 6 次编辑]

作者:ucgui
home:http://www.ucgui.com

[ucgui原创] 经过几天连夜的开发, 终于推出UCGUI-VIEW的还原版模拟器---emWin 1.0.0.0
      经过连续几天的开发, 白天工作, 晚上少睡觉, 搞到二点钟, 终于推出了可以查看UCGUI模拟器的编译后的程序运行效果查看器, 关于GUISime.Lib模拟库的推出, 将在以后一两个星期之内....
      只要是研究UCGUI的朋友, 肯定会知道它是提供了以下两个东东的...
      1. TOOLS目录下的uC-GUI-View.exe-------查看UCGUI程序运行结果.
      2. Simulation下面的GUISim.lib---------------将ucgui的程序编译WINDOWS下的PE文件,向作者显示UCGUI下的图形功能.
      对于这两个东西, 感兴趣的朋友, 一定会产生UCGUI程序是如何在windows环境下运行并显示出其GUI函数的效果的, 我们其实可以称UCGUI中提供的是一个模拟器, WINDOWS下的模拟器, 它可以让我们看到它的图形效果. 进行UCGUI的图形程序编程. 这对于我们学习UCGUI下的图形开发非常的方便.
      但是我们不应该只知其然, 不知其所以然.
      其实实现的原理还是比较简单, 首先它是通过位图来实现的, 通过在内存中开一块内存, 当作显示器的一个平面, 与显示器上的每个点相对应, 将显示器上的每个象素按行一行一行的保存在这个内存区域当中, 然后再将些区域中的数据以显示位图的方式画到窗口上, 用的是SetDIBitsToDevice(同等大小),StretchDIBits(比例显示)这两个函数来实现的.
      这样, 其实GUI中每个函数所操作的象素其实就是在这片内存区域中进行的, 对于8位及8位以下的, 由于显示位图时还要调色板, 所以还有一个区域专门来存放调色板信息的, 这一信息也是由模拟器来初始化的.
      其实这是大致的原理, 出是了核心的一步, 具体的细节, 我将推出一系统的文章, 希望大家可以关注, 并从中与我交流...
      ucgui-view模拟器v1.0.0版下载, 在今后的一段时间, 我们还将继续加强功能...
      如下图所示1-1所示:

[ucgui原创] 嵌入式的一些资料的下载(ucgui/ucos等)
      嵌入式的一些资料的下载(ucgui/ucos等)
     1. 嵌入式图形系统uc/GUI 3.24版源码下载(包含vc下的示例程序):
     http://www.macro-tax.com/home/ucgui/ucgui324.rar
     2. 嵌入式图形系统MiniGUI 1.3.0版源码下载:
    http://www.macro-tax.com/home/ucgui/Minigui130.rar
     3. MiniGUI下Windows环境的模拟器及五子棋程序下载:
    http://www.macro-tax.com/home/ucgui/Minigui-fivechess.rar
     4. 嵌入式图形系统 LGUI源码下载
    http://www.macro-tax.com/home/ucgui/lgui_0.3.0.tgz
     5. 嵌入式操作系统 uc/OS 2.52 版源码下载:
    http://www.macro-tax.com/home/ucgui/ucos252.rar
     6. Uc/os在80x86上的移值版本, 编译成DOS下的EXE文件.
    http://www.macro-tax.com/home/ucgui/ucos252-x86.rar
     7. Uc/os在arm7~9 上的移值版本, 编译成linux下的ELF文件, 通过自由开放源码软件----skyeye虚拟仿真机运行, 在LINUX下环境下运行.
    http://www.macro-tax.com/home/ucgui/ucos252-arm7.rar
     8. Skyeye 0.9源码下载:
    http://www.macro-tax.com/home/ucgui/skyeye090.rar
     9. 嵌入式的uc/fs文件系统下载:
    http://www.macro-tax.com/home/ucgui/ucfs20.rar
    10. 嵌入式的网络协议实现 uc/tcpip 下载:
    http://www.macro-tax.com/home/ucgui/uctcpip20.rar
    11. 另外一嵌入式网络协议实现Lwip 0.6 下载:
    http://www.macro-tax.com/home/ucgui/lwip060.rar
还有一个中文的操作系统PYOS的早期版的...
    12.   PYOS----国内人牛人推出的中文图形化操作,虽然现在的版本还是比较简单,我所选择的版本比现在的还要早,因为我觉得这样的话,更用利于学习的人了解一个操作系统到底是如何写成的,其实这个版本的PYOS只能算是一个开机便能自己运行的系统程序而已.是针对80X86保护模式体系下的,有自己的引导,加载部分,它一开机便能自己运行,了解这个,你可以大大的了解为什么PE文件是多么的方便与复杂,一点击就由系统来运行了, 但是要做一个自己引导自己运行的系统程序,就不那么容易,PYOS正好满足你这方面的兴趣与问题,我对此源码有一定学习,有什么问题可能交流...
    以下是PYOS的一截图...
    http://www.macro-tax.com/home/ucgui/pyos1216.rar
    还有一个LINUX早期版本的操作系统, linux0.11版本...
    13.   linux0.11版本----关于这个版本的学习, 在网上比较流行, 而且有一个论坛专门学习讨论这个版本的LINUX, www.oldlinux.org, 学习这个版本的原因是, 它本身是一个比较完备然而又非常简单的早期LINUX系统, 总代码量为14000行.对于学习来说, 是比较适合的.
    linux0.11中文注解源码下载...
    http://www.macro-tax.com/home/ucgui/Linux011_ch.rar
    linux0.11原文注解源码下载...
    http://www.macro-tax.com/home/ucgui/Linux011_en.rar
    还有, 对于这个版本的学习, 最好去www.oldlinux.org. 再就是下载一个Bochs-2.1.1版的虚拟机来....
    另外还提供了阅读这些源码非常方便的一个工具InSight3.0...
    14.InSight3.0----非常方便的源码阅读工具,利用它你可以很方便的找到你要找的函数及变量,结构体等等的声明之处/定义之处,而不须要先编译源程序...
    http://www.macro-tax.com/home/ucgui/insight30.exe
    15.还有UCOS的模拟器下载, 可以让使用者很方便的进行UCOS的开发,了解UCOS的多任度调原理, 在VC环境下, 对于WINDOWS的用户非常的方便...
    http://www.macro-tax.com/home/ucgui/simuos_ucos110.rar
   
    可惜这个模拟器没有公开源码, 我将在未来二周内,开发完UCGUI的模拟器源码后, 再开发UCOS的模拟器..并将公开源码...希望与大家交流...
文字
35_383.gif
 楼主| 发表于 2005-6-8 21:01:27 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

[这个贴子最后由ucgui在 2005/06/08 09:12pm 第 1 次编辑]

[ucgui原创]
emWin-----UCGUI的WINDOWS下模拟器的实现原理分析之一(还原emWin为C源码)
[以下分析全部通过IDA反汇编.用的是4.5版.]
使用过UCGUI的朋友..应该都知道, 我们写的GUI程序, 在VC的那个示例当中, 都是与提供GUI服务的代码是编译在一起的, 这部分代码即放在两LIB文件当中:
GUISim.lib-----提供WINDOWS程序的接口, 负责模拟一个虚拟的显示器. 来显示出UCGUI中的图形.
GUI.lib----------提供GUI中各中画图的函数, 是供应用程序调用的GUI API函数.
现在我重点讨论GUISim.lib.
一. emWin-----UCGUI的WINDOWS下模拟器的实现原理分析之一(还原emWin为C源码)
1.1模拟器的构成模块分析.

//emWin模拟器的几个模块简介...
//2005-05-20
main.obj---------------------调用用户程序的MainTask().
WinMain.obj------------------创建模拟器窗口,mouse/keyboard处理.
SIM_X.obj--------------------初始化并检测LCD宽高及透明色(FF0000),并设置"显示器"在装备位图中的位置.
LCD_X_SIM.obj----------------LCD_X_Init与硬件相关的初始化.
LCDSIM_1.obj-----------------功能与LCDSIM.OBJ类似,但是另外一种显示器输出功能.
LCDSIM.obj-------------------模拟器显示窗口LCD的显示,相当于作显示器输出.
GUI_X_SIM.obj----------------实现系统的一些互斥等.
Branding.obj-----------------emWin版权信息.
[未完待续]
35_383_1.gif
 楼主| 发表于 2005-6-9 09:39:36 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

[这个贴子最后由ucgui在 2005/06/09 09:56am 第 1 次编辑]

[更新]
[告知读贴者]
     
     由于以上提供的各个连接地址的网站ICP备案出现一点小问题, 今天上午可以无法访问了, 但将在二天内开通, 希望继续关注, 现在将ucguiview1.0.0.2版本的源码发到这人论坛上, 供大家下载....谢谢...如急须,可以加我QQ:106719880, 通过QQ传送, 加好友时请注明是"UCGUI论坛"字样...
     1. ucgui-view模拟器v1.0.2版下载推出, 2005/06/09...请大家关注.....
     2.即将推出GUISim.lib库源码, 请大家关注.....
      ucgui-view模拟器v1.0.2版下载,[2005/06/09] , 这是最新版本, 修改了一些前版本的BUG, 增加了MOUSE支持, 本站将于近日推出GUISim.lib的模拟库源码.
      其实推出UCGUIVIEW的源码, 只要加一些改动, 完全就是模拟器源码, 不过它比模拟器做的事情还少一点, 不须要做一些调色板等的初始化.

35_383_2.rar

504.37 KB, 下载次数: 465 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2005-6-10 11:35:29 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

天吶   真是挖到寶了....  
发表于 2005-6-10 13:46:15 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

好东西
学习学习
 楼主| 发表于 2005-6-10 16:29:03 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

UCGUI论坛网站已经恢复正常访问了...
出现了一天不能正常访问的情况,,请大家继续关注....
近几日还将推出GUISim.lib库源码...
到时时候大家将可以在模拟器的源码与UCGUI的源码下进行UCGUI图形编程, 完全没有任何隔膜, 任何东西都是开放的...
再过一二周, 本人还将推UCOS+UCGUI的模拟器源代码, 并写出实现原理, 请大家关注...
如果没有必要回贴, 请大家不要回贴, 因为我还将在此贴中写一些技术原理,,,如果回复多了,,将不利读者看贴...谢谢....
 楼主| 发表于 2005-6-13 10:28:27 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

[这个贴子最后由ucgui在 2005/06/14 06:45pm 第 3 次编辑]

[更新提示: UCGUI论坛又提供了CSWORD朋友的UCGUI在DOS的移值版本,以及GUISIM源码下载,以及完整的工程文件及BORLAND3.0环境!!]
ucgui的模拟器UCGUISim 1.0.0.3源码下, 完全提供源码, 不须要GUSim.lib库文件...
***********************************************************************
  REVISION LOG ENTRY
  Revision By: ucgui
  Revised on  2005-6-13 0:59:52
  Comments: GUISim 1.0.0.3
***********************************************************************/
//工程结构说明
project----------------------存放工程.
doc--------------------------存放文档.
Simulation-------------------模拟器源码文件.
resource---------------------资源.
gui/include------------------ucgui的各中头文件.
gui/Library------------------包含GUI.LIB库,供调用ucGUI函数
gui/GUISource----------------UCGUI源码文件.
gui/Config-------------------UCGUI配制文件.
gui/Application--------------UCGUI应用程序文件.
   
     1. 提供基本的汉字支持,从csword网友的ucgui在dos下的移值版中改良而来, 直接利用其HZ.C文件,但修改了他的程序中显示汉字的一个问题, 详见说明文档.
     [说明:csword网友的UCGUI在DOS下的移植版本有一定的学习意义, 因为它同时也整合了UCOS, 可以进行UCGUI+UCOS的联合编程, 编译器用的是BORLAND3.0版,csword的这个东东在本站有下站.csword用的是BORLAND提供的BGI标准VGA驱动, 所以对于图形处理, 不是直接写, 而是调用BGI中的函数来写象素点]
    2. 修改了创建UCGUI执行主线程的一个BUG...
    3. 修改了在支持MT_MultiTasking.c示例时显示出来的一个BUG, 是关于多任务模拟的问题主要是在SIM_Start函数所在线程,即MainTask所在线程在创建完GUI应用线程后就退出,
导致在暂停及重新开启功能时出错.因为它们操作的对象即是GUI应用主线程...
有待下一版本增加功能:

  1.增加键盘支持.
  2.增强LOG支持, 使不仅可以用Dbgview.exe来捕捉LOG. 还可以查看LOG文件..
  3.增加原示例包中有一个图形窗口的支持[指用一张模拟硬件电图中来显示LCD显示屏]
下载连接:  UCGUISim 1.0.0.3 版本下载.....
  http://www.macro-tax.com/home/ucgui/GUISim1003.rar
           GUISimLIB库下载,
  http://www.macro-tax.com/home/ucgui/GUISimLIB1003.rar
[与上面的区别是写UCGUI应用程序时,可以直接包含这个LIB库,而不须要模拟器源码]
以下是截图:
35_383_6.jpg
 楼主| 发表于 2005-6-17 19:13:52 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

[这个贴子最后由ucgui在 2005/06/17 07:15pm 第 1 次编辑]

GUISim1.0.0.4下载, 增加键盘支持,修改了配制问题及放大时的mouse支持...

/***********************************************************************
  REVISION LOG ENTRY
  Revision By: ucgui
  Revised on  2005-6-17 19:09:52
  QQ:106719880
  Email:ucgui@163.com
  Home:http://www.ucgui.com
  Comments: GUISim 1.0.0.4
***********************************************************************/
  1. 增加键盘支持.
  2. 增强LOG支持, 使不仅可以用Dbgview.exe来捕捉LOG. 还可以查看LOG文件..
  3. 修改BytesPerLine在16位的情况下的BUG, 这是因为本模似器采用的是显示位图的原理, 而位图是须要四字节对齐的. 原来的注解有误, +3是为了达到4字节对齐.
     BytesPerLine = (XSize + 3) & 0xFFFFFFFC;  //8位及以下.
     BytesPerLine = (XSize* 4 + 3)  & 0xFFFFFFFC; //8位以上..
  4.修改配制上的问题, 在GUI下面有一个Include的目录, 原先在工程的[c++\Addition Include Directroy]设置当中, 采用的 的是GUI\Include里面的头文件, 但是在GUI的源码下面已有那些头文件, 从而导致混乱, 即使修改了其中一个头文件中的内容, 也会导到这个修改不起作用, 比如修改LCD_XMAG这个参数. 所以, 在现在的工程当中,全部不用Include目录下的文件, 只用GUISource目录下的, 这些.h的头文件散布在Core, WM等几个目录中.
另外, 在原先的工程当中, 即使修改了Config下面的预定义也不会产生效果, 是因为在GUI\GUISource\core下面也包含了那同配制文件, 在现在的工程中, 这些头文件已经清除掉.(GUIConf.h,GUITouchConf.h, LCDConf.h)
   5.在官方提供的模拟器当中, 无法支持在LCD_XMAG及LCD_YMAG不为1, 即图象放大时的mouse支持,其实要支持也只须要很简单的修改, 就是在传入mouse的x,y坐标时, 分别除以LCD_XMAG,LCD_YMAG; 而且在处理mouse的点击范围时, 要扩大接收mouse消息的范围, 详见源码注解.
GUISim1.0.0.4下载
35_383_7.jpg
 楼主| 发表于 2005-6-17 19:22:48 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

[这个贴子最后由ucgui在 2005/07/01 12:43pm 第 3 次编辑]

在UCGUI中增加汉字显示的说明.
作者: ucgui
日期: 2005-06-25
来源: http://www.ucgui.com
文档版本: v1.0.0.0
UCGUI中本身只支持E,没有提供中文的字库的.C源码文件, 但是我们可以通过下面的方式来实现汉字的显示...
我们知道, 在DOS下经常利用点阵来显示汉字. 带汉字显示的程序,很多都会自己带上汉字库, 这个字库里放的就是每个汉字的点阵.
一. 汉字的显示原理之一 -----------------点阵汉字.
简单的理解, 所谓一个字的点阵. 其实就是指这个汉字用多少个象素点来描述. 每个象素点显示为什么颜色, 通常情况下, HZK16采用的是16*16点阵, 即256个象素点描述一个汉字.
这些点的颜色分为两种, 一种是前景色, 一种是显示为背景色.
那么,关于那些点显示为前景色, 那些点显示为背景色, 是如何得知的呢??
可以这样来考虑, 你在纸上比较正正方方的写一个规则的楷字, 然后在这个字的从上到下,左到右, 分别画十七条直线, 那么这
个字就被放置于一个16*16的方格之内, 这样我们就可以很明显的看出, 16*16的方格内的具体哪些点有笔划经过, 有笔划经过与没笔化经过的即就是应该被分别填充上前景色与背景色的点.
现在,找到了一个汉字的点阵, 那么还须要用数据来记录点阵的信息, 通常情况下, 我们会用32个字节来表示16*16点阵的汉字,
即每一行用二个字节来记录十六个象素点的色色彩情况, 0表示背景色, 1表示前景色. 16行其须要32个字节.点阵汉字的原理同时也决定了它的缺点, 他不具务放大特性, 因为它的显示是基于被定死的点阵, 放大后, 会产生明显的锯齿,非常的难看, 当然, 可以进行一些光滑处理, 但基本上没有多在的改观.但点阵汉字简易, 对于复杂汉字, 它比矢量显示汉字法更快带.矢量显示是基于记录汉字的笔化的. 对于简单的汉字它比较占优势, 容易放大处理. 但对于复杂的汉字, 表示起来, 则笔化太多..复杂.

二. 关于字库的建立及其原理.
现在讲完了汉字点阵. 也说了一个汉字点阵的存放方式, 但具体的点阵如何存放, 读者也应该了解.
通常情况下, 一般的DOS下的程序都会提供一个汉字库, 这样在脱离汉字平台(如UCDO)的支持下也可以进行汉字显示, 但是这样会存一个问题, 就是如果每个DOS下的程序员都这么做的话, 就会造成一定的磁盘空间浪费. 所以有的DOS下的程序,针对自己所需要的汉字, 就会定制自己的小型字库, 那么字库的制作到底应该如何进行呢? 下面我们将就这个问题进行一些基本的讨论.

众所周知,一个ASCII字符占一个字节,它的数值从0到255, 那么汉字字符将如何与ASCII字符区别开来呢?实际上,仔细观察ASCII字符表,从第161(即0xa1)个字符开始,后面的字符并不经常为E文所使用。充分利用这一特性,将161-255之间的数值空间作为汉字的标识码。既然255-161 = 94不能满足汉字容量的要求,就将每两个字符并在一块(即一个汉字占两个字节),显然,94* 94 =8836基本上已经满足了常用汉字个数的要求。
从以上的讨论可以知道, 用二个字节来表示一个汉字, 其原因就是上面说的, 这个就是我们常说的汉字机内码, 一个汉字的机内码是由值都大于0xa1的值组成的.
说完机内码, 有的朋友可能就会问题, 机内码与建立汉字字库有什么关系呢??
我们常见的标准的汉字字库HZX16(点阵16*16),HZK24(24*24)两种.由上面的讨论我们得知, 一个汉字点阵须要256个象素点阵来表示, 我们采用一个字节的8位来表示八个象素, 其须32个字节; 字库中要存放的是所有常用的汉字的二进制点阵数据, 它的存放是有序的, 下面我们说一下这个顺序:
首先.对于"我"字来说, 它的机内码是0xce,0xd2; 机内码每个字节均从0xa1开始, 那么我们已经采用的建立点阵字在库中的索引方法是:
将整个字库里面的汉字是94*94的二维数组, 要找任意一个汉字的点阵, 就须要知道这个汉字在这个二维数组当中的X维与Y维.
x维 = (机内码字节1-0xa1) & 0x7f;
y维 = (机内码字节2-0xa1) & 0x7f;
求汉字在X,Y维后, 那么按照每个汉字占用32个字节, 则可以得出汉字相对于字库头的偏移是 offset = (x*94 + y)*32;

其实,X与Y就是汉字的区位码, 汉字的区位码是从0-94的. 但实际上只用了16-87..
其中一级汉字在16-55..二级汉字在56-87.是按照一定的规则来确定区位码的.对于一级汉字.是按拼音首字母级笔划.二级汉字是按部首来的.我特意生了一个汉字的区痊码,机内码.在字库中偏移的文件..大家可以下载来看一下. 可以知道:
啊-------------区位码(x = 15, y = 0); offset=b040; 机内码0xb0,0xa1);
所以汉字的区内码,机内码,偏移的信息,请下载这个文件查看.
http://www.macro-tax.com/home/ucgui/HZK_info.rar
其中,区位码(x=0-14)与(88-94)都是没有对应汉字的.字库中实际的对应汉字点阵字数为94*72=6768个汉字.
实际上, 一个字库中有前16*32个字节没有表示具体的汉字的, 在字库里被用来表示什么东西没有什么具体的要求, 如果说你自己要做一个字库.那么这一段你可以自己发挥, 填充为一个中文的符号,笑脸,特别文字什么的.这些没有具体的要求.
同理.对于(88---94)*32, 你也可以自己发挥. 然后告知别人如何使用,因为这个没有标准, 所以一定要有特别的说明,别人才可可以使用.
在一般的HZK16当中, 最前16*32个节有表示两个大小的"A"及两个感叹号, 一个在圆内的"帅"字..大家可以仔细看一下,其它几个没作特别使用.

三.应用程序中进行汉这显示的处理
那么, 在以上我们谈了汉字的显示原理, 汉字字库的存放原理, 其实都是为了更方便的让我们自由使用..在实际小, 一个应用程序未必须要显示所有的汉字, 可能他仅须要显示1000个常用的汉字, 那么就可制作一个1000个常用的小型汉字字库, 即所需要的汉字库从250K降到32K左右了, 大大的减少了资源占用,使用上非常的灵活.

四. 在UCGUI中如何加入汉字显示的支持.
UCGUI中没有汉字功能的支持, 但其实只要稍加改造, 我们就可以解决点阵汉字显示的问题.
UCGUI中, 对于E文的显示, 也同样采用的是点阵的方式, 而且有8*8,6*8, 16*8, 16*16等各种点阵, 这里, 我们可以实现在设置显示16*16的E文字体时, 加上我们的汉字显示, 因为是同样的点阵, 我们不用任何改造, 只要有HZK16文件, 就可以在此E文字体下显示汉字了.
全部的改造基本上集中在这个函数内部.
void GL_DispLine(const char GUI_FAR *s, int Len, const GUI_RECT *pRect);
这个函数在GUI\Core\GUIChar.c 文件内部
要支持汉字显示, 那么必须改成如下形式.
void GL_DispLine(const char GUI_FAR *s, int Len, const GUI_RECT *pRect) {
  /*
    Check if we have anything to do at all ...
    If the window manager has already set the clipping rect, it does not
    make sense to due this. So it makes sense only if
    a) The window manager is not used (-> Configuration)
      or
    b) The window manager is inactive (-> Memory device active)
  */
  if (GUI_Context.pClipRect_HL) {
    if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0)
      return;
  }
  if (GUI_Context.pAFont->pafEncode) {
    GUI_Context.pAFont->pafEncode->pfDispLine(s, Len);
    return;
  }
#if (GUI_SUPPORT_UNICODE)
  {
    U8 c0;
    char UCActive=0;
    while (--Len >=0) {
      c0=*(U8*)s++;
      if (UCActive) {
        if (c0 == GUI_UC_ENDCHAR)
          UCActive = 0;
        else {
          U8  c1 = *(U8*)s++;
          Len--;
          GL_DispChar (GUI_DB2UC(c0, c1));
        }
      } else { /* Unicode not active */
        if (c0 == GUI_UC_STARTCHAR)
          UCActive = 1;
        else
{
  //增加汉字支持所加的...2005-6-13 0:14:09
  if (c0&0x80 && (*(U8*)s)&0x80){
char hz[3];
hz[0]=c0;
hz[1]=*(U8*)s;
hz[2]=0;
WriteHZ(0,0,hz,0);
s++;
  }
  else
GL_DispChar(c0);
}
      }
    }
  }
#else
  {
  U8 c0;
  while (--Len >=0) {  
  c0=*(U8*)s++;
  //增加汉字支持所加的...2005-6-13 0:14:09
  if (c0&0x80 && (*(U8*)s)&0x80){
  char hz[3];
  hz[0]=c0;
  hz[1]=*(U8*)s;
  hz[2]=0;
  WriteHZ(0,0,hz,0);
  s++;
  }
  else{
  GL_DispChar(c0);
  }
  }
  }
#endif
}

处理汉字显示:
int WriteHZ (int x, int y,const char *p,int color)
{
  U16 c1,c2,rec;
  long l;
  char pixeldata[32];
  int BytesPerLine;
  GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
  GUI_DRAWMODE OldDrawMode;
  if (handle<0 ) return 0;
  if (p==NULL) return 0;
  c1=(p[0]-0xa1)&0x07f;
  c2=(p[1]-0xa1)&0x07f;
  rec=c1*94+c2; //汉字库94*94的二维结构...
  l=rec*32L;//求字库偏移...
  lseek(handle,l,SEEK_SET);
  read(handle,pixeldata,32);
  BytesPerLine = 2;
  OldDrawMode  = LCD_SetDrawMode(DrawMode);
//半汉字点阵以二色位图方式绘出, 前景色/背景色
  LCD_DrawBitmap (GUI_Context.DispPosX, GUI_Context.DispPosY,
  HZSIZEX,HZSIZEY,
  1, 1,
  1,            /*Bits per Pixel */
  BytesPerLine,
  (U8*)pixeldata,
//  NULL  /* no palette means default palette */
  &LCD_BKCOLORINDEX  
//在csword的bc3.0版本中, 是用NULL, 但在此处要要修改, 表明此
//位图所用调色析为二色, 前景色与背景色...
  );
  LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
  GUI_Context.DispPosX += HZSIZEX;
  return 1;
}

另外, 除了以上所讲的, 我在网上发现如下的一篇文章非常适合大家加强对汉字处理的理解. 汉字处理在DOS时代是一个比较热门的技术, 但在现在的WIN时代.没有什么人关注了, 但是在嵌入式开发了, 它还有一定的用武之地, 理解它还是有一定的帮助的.
一篇介绍汉字处理的文章, 非常不错, 很基础,很明白, 其分四节来讲汉字的基本原理.
http://www.vcer.net/showTip.jsp?tipid=2291

 楼主| 发表于 2005-6-24 13:38:14 | 显示全部楼层

ucos的GUI图形系统ucgui的模似器源码设计文档及各种资料

汉字显示用纯字库与.C字库源码文件的区别
     楼上的, 其实我们所用的显示汉字的途径是不同的. 是两种方法, 但都是以点阵来显示来处理汉字显示的, 不同点在于你的汉字点阵是与你的程序编译在一起的, 汉字点阵的数据包含在你程序当中了.
     你所说的方法, 其实用的是汉字库弄出的点阵数据的.C文件, 这是别人从汉字库中生成的. 这种方法与UCGUI中本身处理文字显示的方法是相同的, 都提供了所须文字的点阵及显示文字的方法函数. 关于具体如何实现, 我将会更详细的写一篇介绍文章.
     至于我的汉字显示, 说的是直接利用汉字库, 而不用什么.C的汉字库字体文件, 根本不用UCGUI中本身的一套方法, 但本质还是相同的, 以位图来显示点阵汉字, 为了显示汉字, 须要点阵汉字库, 及显示汉字的函数(WriteHZ()). 而且还要修改UCGUI中的显示字符的函数, 来特别处理汉字的显示. 因为汉字的机内码与ASCII中英文的有差别, 是从a1往上走的, 所以很容易区分开来.
     关于你的. 你的是下载使用了中文字库的.C文件, 这个在网上是有.如下.
     一个优化过的完全版的ucGUI汉字库_hzk12使用方法:
     将解压后的hzk12.c放到ucGUI的font路径下
     在GUI.H文件内加一行:extern const GUI_FONT GUI_FontHZ12;
     按如下形式调用即可显示中文了:
     GUI_Init();
     GUI_SetColor(GUI_RED);
     GUI_SetFont(&GUI_FontHZ12);
     GUI_SetTextAlign(GUI_TA_LEFT);
     GUI_DispStringAt("汉字库显示测试",20,20);

GUI_FontHZ12 下载.
http://www.ucgui.com/ucgui/ucGUI_hzk12.rar
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-24 15:55 , Processed in 0.037109 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表