|
uC/GUI NIOS II移植之Text显示
今天研究了uC/GUI的文字显示系统。 这个系统的功能相当强大,提供了一下几个函数。 GUI_DispChar() 显示一个字符 GUI_DispCharAt() 在某个位置显示一个字符 GUI_DispChars() 显示n个设定的字符 GUI_DispString() 显示一个字符串 GUI_DispStringAt() 在某个位置显示一个字符串
还有好大一堆函数,不过这几个是最基本的。 先看一段有关这些代码的事例程序: void MainTask(void) { unsigned int i; GUI_Init(); 初始化,设置的默认字体是6*8的一种字体,具体叫什么忘了 GUI_SetColor(GUI_YELLOW); 设置显示颜色为YELLOW,这里指的是字符的颜色 GUI_DispChars('*', 108); 从当前坐标起显示108个*,就是截图里面的最上面的那排* for(i = 0; i < 480; i+=8) { GUI_DispCharAt('*', 1, i); } 在第一列显示一列* GUI_DispChars('*', 108); 在最下面一行显示一排* for(i = 0; i <= 480; i+=8) { GUI_DispCharAt('*', 634, i); } 在最右边的一列显示一列*
GUI_SetColor(GUI_GREEN); 设置显示的颜色为GREEN GUI_SetFont(&GUI_Font8x10_ASCII); 设置字体为GUI_Font8*10_ASCII GUI_DispCharAt('A', 100, 100); 在坐标100,100处显示一个A GUI_DispString("! Hello World! "); 显示Hello World!大家注意这是紧跟着A显示出来的,即它是在当前光标处显示字符的 GUI_SetFont(&GUI_Font32_ASCII); 设置字体 GUI_SetColor(GUI_YELLOW); 设置显示颜色为YELLOW,下面代码显示的字符都是黄色的 GUI_DispChars('*', 15); 显示15个* GUI_SetBkColor(GUI_BLUE); 设置背景颜色为BLUE,大家注意这个背景颜色,是衬在字下面的,而不是整个的背景 GUI_DispCharAt('B', 600, 400); GUI_SetFont(&GUI_Font32B_ASCII); GUI_SetColor(GUI_RED); GUI_DispStringAt("Hello World!", 1, 200); 在1,100这个地方显示字符串,注意覆盖掉了原先显示出来的* GUI_Delay(1000); } 效果图
这样基本的字符显示函数就完了。大家都会使用了。 在前提到这个GUI支持UNICODE。 既然支持UNICODE那就应该能显示中文才对啊! 当然能显示中文,但关键问题是字体! 这里就讲一讲有关字体的提取。 首先要用到一个字体转换工具,因为我们得到的uC/GUI代码基本上都是D版的,里面所附的字体转换工具都是DOME版,根本转换不出来正常的字体.c文件。在这里要用到另外一个程序。 声明:该程序转载自www.ucgui.com,所有权归原作者ucgui所有,这里只是转载。仅上船该程序的可执行文件 http://www.ednchina.com/Upload/Blog/cecb4a69-b388-4a9f-916d-2b216f8edcc9.rar 声明:在这里特便感谢原作者做出的贡献! 首先运行程序,看到如图的程序界面,相当的简单。
然后点击选择字体。按扭出现新的对话框,我选择的字体如图所示。
确定后回到主界面,点击 看到这个对话框文件就转换好了!
直接加载进模拟器工程就可以享受中文字体带来喜悦了! 在这里上传两个转换好的字体宋体(5号字)和Times new roman(5号字)两个字体,供大家参考,其中Times字体去掉了除ascii码之外所有的其他字模。 http://www.ednchina.com/Upload/Blog/622a4994-39aa-4380-a8cc-4cef5e57b7df.rar 说一下这里的5号字对应的就是16*16的汉字字体。
宋体那个文件体积巨大3Mb多,如果是大字体的话就有十几MB了! 我们现在运行下面的程序,体验一下中文的喜悦! #include "GUI.h" extern GUI_FLASH const GUI_FONT GUI_FontHZ_FangSong_GB2312_14; extern GUI_FLASH const GUI_FONT GUI_FontHZ_Times_New_Roman_14; extern GUI_FLASH const GUI_FONT GUI_Font8x10_ASCII; extern GUI_FLASH const GUI_FONT GUI_Font32_ASCII; extern GUI_FLASH const GUI_FONT GUI_Font32B_ASCII; /*这几行一定要有,声明从外部引用这个数据结构,建议大家将所有的字体的定义弄成一个头文件,这样子比较方便!*/ void MainTask(void) { unsigned int i; GUI_Init(); GUI_SetColor(GUI_YELLOW); GUI_DispChars('*', 108); for(i = 0; i < 480; i+=8) { GUI_DispCharAt('*', 1, i); } GUI_DispChars('*', 108); for(i = 0; i <= 480; i+=8) { GUI_DispCharAt('*', 634, i); } GUI_SetColor(GUI_GREEN); GUI_SetFont(&GUI_FontHZ_Times_New_Roman_14); GUI_DispCharAt('A', 100, 100); GUI_DispString("! Hello World! "); /*仔细看这里的字体已经是Times new roman了和上面的是不一样的*/ GUI_SetFont(&GUI_Font32_ASCII); GUI_SetColor(GUI_YELLOW); GUI_DispChars('*', 15); GUI_SetBkColor(GUI_BLUE); GUI_DispCharAt('B', 600, 400); GUI_SetFont(&GUI_FontHZ_FangSong_GB2312_14); GUI_SetColor(GUI_RED); GUI_DispStringAt("大家好这里是中文显示演示程序!", 1, 200); /*将上面程序中的Hello World替换成了中文!*/ GUI_Delay(10000); }
还有一个郁闷的问题,文件太大了有的编译器有限制!例如VC.NET的编译器。好在NIOS II编译器没有这个限制。 看看图:
实际测试不影响使用,我们测试了4000多个汉字没有发现什么问题。
|