程序清单 4.1 建立一个自动更新窗口的回调函数
void WinHandler (WM_MESSAGE * pMsg)
{
switch (pMsg->MsgId)
{
case: WM_PAINT GUI_SetBkColor(0xff00);
GUI_Clear();
GUI_DispStringAt(“hello world”,0,0);
Break;
}
} |
程序清单4.2 回调函数
#include GUI.H
/* 背景窗的回调函数 */
static void cbBackgroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_Clear();
default: WM_DefaultProc(pMsg);
}
}
/* 前景窗的回调函数 */
static void cbForegroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_SetBkColor(GUI_GREEN);
GUI_Clear();
GUI_DispString(Foreground window);
default: WM_DefaultProc(pMsg);
}
}
/* 回调机制 */
static void DemoRedraw(void)
{
GUI_HWIN hWnd;
while(1)
{
/*创建一个前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100, WM_CF_SHOW, cbForegroundWin, 0);
/*显示前景窗*/
GUI_Delay(1000);
/* 删除前景窗 */
WM_DeleteWindow(hWnd);
GUI_DispStringAt(Background of window has not been redrawn, 10, 10);
/* 等待,显示并不重绘 */
GUI_Delay(1000);
GUI_Clear();
/* 设置背景窗的回调功能 */
WM_SetCallback(WM_HBKWIN, cbBackgroundWin); |
/*创建一个前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100,WM_CF_SHOW, cbForegroundWin, 0);
/* 显示前景窗*/
GUI_Delay(1000);
/*删除前景窗 */
WM_DeleteWindow(hWnd);
/* 等待,显示将重绘*/
GUI_Delay(1000);
/* 删除回调函数 */
WM_SetCallback(WM_HBKWIN, 0);
}
}
void main(void)
{
GUI_Init();
DemoRedraw();
} |
如果你下载最新版的ucgui3.90a的话, 它的模拟器本身就是开源的.你可以看到你的UCGUI应用程序是如何跑起来的. 它是WIN下面的一个线程,模拟器程序是主线程.
还有, 在我的网站下面, 我先前就已经以写出了3.24版的UCGUI的模拟器程序, 到www.ucgui.com下就可以下载到.
模拟器的原理是很简单的,就是把内存中的数据弄成位图显示出来而已.
移植
转载http://blog.csdn.net/lyx_wq/archive/2009/09/21/4576203.aspx
mini2440上无操作系统移植ucGUI
由于不要把过多时间浪费在底层驱动上,这次我直接用mini2440开发板附带的 非操作系统示例代码的2440板上资源测试程序为基础,移植ucGUI。
UcGUI的移植主要修改三个头文件和两个C文件。三个头文件都在\Config下,分别是GUICon.h ,GUITouchConf.h,LCDConf.h ;两个C文件一个是GUI_X.C(Sample\GUI_X.C) ,.另外一个在GUI\LCDDriver目录下(我是选择LCDWin.c来修改的)。
1.修改头文件LCConf.h
主要修改的地方:
#define LCD_XSIZE (240)
#define LCD_YSIZE (320)
//#define LCD_BITSPERPIXEL (8)
#define LCD_BITSPERPIXEL (16) //16Bpp
#define LCD_CONTROLLER 1375
LCD_XSIZE ,LCD_YSIZE 是对应你的LCD的尺寸大小
LCD_BISPERPIXEL 指定每象素的位的数量
LCD_CONTROLLER控制器部分我没改,按原来定义的1375。uC/GUI的技术文档上没有Sharp FTFP屏的控制器,就用LCD13XX中的一个来代替。
2 修改头文件GUI_Conf.h
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (0)
#define GUI_SUPPORT_TOUCH (0)
#define GUI_SUPPORT_UNICODE (1)
#define GUI_DEFAULT_FONT &GUI_Font6x8
//#define GUI_ALLOC_SIZE 12500
#define GUI_ALLOC_SIZE 1024*1024
#define GUI_WINSUPPORT 0
#define GUI_SUPPORT_MEMDEV 0
#define GUI_SUPPORT_AA 0
#endif
GUI_0S 位1时支持OS,否则就是裸跑吧
GUI_SUPPORT_TOUCH 是否支持触摸屏
GUI_SUPPORT_UNICODE 是否支持ASCII/UNICODE
GUI_DEFAULT_FONT 选择一个默认的字体
GUI_ALLOC_SIZE 动态内存的大小
GUI_WINSUPPORT 是否支持 WM(视窗管理器)
GUI_SUPPORT_MEMDEV 是否支持存储设备
GUI_SUPPORT_AA 是否支持反锯齿
3 修改 GUITouchConf.h
如果需要支持触摸屏的话,这个头文件也要作相应的修改。
下面是说明如何修改uC/GUI的两个接口文件。
在LCD的最基本操作就是在某一个坐标上画点,其他的操作都是画点操作延伸出来的。uC/GUI的所有对LCD的操作也是基于这个动作。Mimi2440的底层驱动代码上有这个函数PutPixel(x,y,c)。所以必须要把这个函数连接到uC/GUI的代码里面。连接的函数就在LCDDriver下,我选用LCDWin.c.
修改这个文件的时候要注意,首先要屏蔽掉第一行的条件编译语句 #if defined(WIN32) && !defined(LCD_SIMCONTROLLER) 和文件的最后一行的#endif 顺便把#endif头上的#else 也干掉。这个文件是针对PC仿真的,不注释掉这几个地方,整个文件都不会被编译的。
PutPixel(x,y,c)在LCD_240X320.C中,由于PutPixel(x,y,c)被定义成了 static ,那就在LCD_240X320.C的后面加一个外部函数调用PutPixel(x,y,c) 。当然去掉static也行。
void LCD2410_SetPixel(U32 x,U32 y,U32 c)
{PutPixel(x,y,c);
}
然后把LCDWin.c的LCDSIM_SetPixelIndex(x, y, c, LCD_DISPLAY_INDEX)全部替换成LCD2410_SetPixel(x,y,c)
你会发现里面还有一个LCDSIM_GetPixelIndex(x,y, LCD_DISPLAY_INDEX); 那就在LCD_240X320.C造一个函数出来吧。参照 PutPixel() 造一个出来
void GetPixel(U32 x,U32 y,U32 c)
{
if ( (x < SCR_XSIZE_TFT_240320) && (y < SCR_YSIZE_TFT_240320) )
c=LCD_BUFER[(y)][(x)]; //对调过来,呵呵,简单吧!
}
void LCD_Off (void)
void LCD_ON(void)
这两个函数连接到LCD_240X320.C中的Lcd_EnvidOnOff(int onoff)
int LCD_L0_Init(void) 连接到 LCD_240X320.C 中的Lcd_Init();再加上一个清屏的函数
void LCD_L0_ReInit() 连接到LCD_240X320.C 中的Lcd_Init();不加清屏函数。
最后修改GUI_X.C文件
由于没有OS,所以有关OS的语句都得修改,幸好不是很多,就两个地方而已。
GUI_X_GetTime(void) 返回当前的OS_TimeMS ,那就修改一下,把变量赋值一个数比如是10 然后让函数返回这个值就行了 。
GUI_X_Delay(int ms)
自己写个延时程序吧,
GUI_X_Init();完成硬件的初始化,由于用的是现成的代码,板子的初始化都已经完成,我把LCD的初始化放在了这里。
做完以上的工作基本上算是完成了移植的工作了。
最后在主函数的适当位置添加一下程序
int Main()
{
其他代码
**************
GUI_Init();
GUI_DispString("Hello world!");
*************
其他无关代码
}
别忘记包含头文件 GUI.h
编译通过后 ,LCD上就会出现 “Hello World !”了。
以上这些我相信在网上很多地方都可以搜到。下面说下我在移植时遇到的undefined symbol的错误:
1、 Error: undefined symbol LCDSIM_SetLUTEntry (referred from LCDWin.o);
这种错误应该还是很常见的,意思也很明显就是在LCDWin.c中没有定义LCDSIM_SetLUTEntry,一般只要把相应头文件加入即可,但就上面这个特定的错误,我发现函数LCDSIM_SetLUTEntry在LCDSIM.h里定义,而且已经在LCDWin.c里包含进了这个头文件,还是有错误,没办法我只好在LCDWin.c里重新定义了一次(其实这个函数什么也没实现)
void LCDSIM_SetLUTEntry(U8 Pos, LCD_COLOR color, int LayerIndex)
{
return;
}
2、 Error: undefined symbol main (referred from kernel.o)
这个错误我解决了好久,一是源文件里找不到kernel.c这个文件,二是我确实定义了main函数,最后终于在一篇相关文章的评论里找到了这个问题的解决方法(不知道是否具有通用性)原来mini2440的main函数是Main开头的m是大写的,应该改成小写,相关的当然还有起始代码中用到Main的一律小写就可以了。
3、Error:differing redefinition of #define macro U32
U32的定义不一致 为了不想改动太大,我直接把位于GUI\Core\LCD.h中的
#define U32 unsigned long 改为 #define U32 unsigned int
其他一些错误应该是很好改的,希望对大家有所帮助,下篇把触摸屏的功能移植上去。
参考文章:http://hi.baidu.com/mikenoodle/blog/item/e6b031d3519350063bf3cf54.html
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyx_wq/archive/2009/09/21/4576203.aspx
用户1653723 2012-4-26 17:20
用户1611555 2011-7-26 10:32
用户123084 2010-4-7 22:29