UCGUI使用总结

来源:互联网 发布:input file网络图片 编辑:程序博客网 时间:2024/05/16 15:38
很久都没有更新了,得勤快点把自己的笔记给整理出来。下面是我在实际使用UCGUI时碰到的一些情况的总结,写的没有条理也有很多不足,希望可以与大家一起讨论。QQ:一一一九八七一五一三
全文PDF文档下载请点击。


  • 移植
  1. 修改/Config/GUIConf.h文件的宏定义,包含是否使用操作系统,是否使用触摸等参数。
  2. 修改/Config/LCDConf.h文件的宏定义,包含屏的初始化和大小等参数。
  3. 如果使用触摸,修改/Config/LCDConf.h文件的宏定义,包含屏4边点的AD值和XY值是否交换。
  4. 修改/LCDDriver/LCDDummy.c与液晶屏接口函数,包括LCD_L0_SetPixelIndex,LCD_L0_GetPixelIndex,如果需要优先GUI刷屏速度还可以修改其他画线等接口函数。
  5. 如果使用触摸和OS,修改GUI_X_Touch.c中GUI_TOUCH_X_MeasureX,GUI_TOUCH_Y_MeasureY和GUI_X_uCOS.c中的系统延时、信号量等。

  • 使用
    1. 在初始化GUI_Init之后即可正常使用GUI。GUI接口函数通常分2部分,一部分是2D函数,如GUI_DispCharAt(显示字符),GUI_DrawBitmap(显示图片)和等一些画点画线函数。一部分是WM有关的函数,包含各种控件。
    2. 可以使用ucguibuilder这个软件来创建对话框。这个软件可以直观看到每个控件的位置,方便布局,但是生成的代码需要一些修改。
    3. 首先是创建对话框,有两种方式GUI_CreateDialogBox(非阻塞)和GUI_ExecDialogBox(阻塞)如:    system_hWin = GUI_CreateDialogBox(_aDialogCreatexitong, GUI_COUNTOF(_aDialogCreatexitong), &_cbCallback, hParent , 0, 0); 其中,system_hWin是这个对话框的句柄,可以对其隐藏删除等操作。_aDialogCreatexitong这个函数为整体窗体的结构,包括控件类型,控件显示名称,控件ID和位置,其中FRAMEWIN_CF_ACTIVE代表对话框不可移动,也还可设置其他模式。hParent为对话框的父窗体,没有可为0。_cbCallback为这个窗体的回调函数,窗体创建到删除的任何操作都会经过这个回调函数,WM_DELETE(窗体删除),WM_INIT_DIALOG(窗体初始化,包括设置字体大小背景颜色等等),PaintDialog(窗体重绘,窗体有改变会调用这个函数,需要经常刷新的放这里),WM_KEY(按键响应)WM_NOTIFY_PARENT(父窗体来的消息,通常处理触摸的回调函数)

    4. 用对话框搭建一整套菜单页:
      • a)创建一个主对话框,父窗体为0。点击button后触发回调函数创建一个子对话框,如果子对话框下面还需创建可以再创建其子对话框。主对话框下有
      • b)关闭或者隐藏一个对话框其子对话框同样会关闭或隐藏。同时会自动返回到上一级的父对话框界面,但是焦点已经跑飞了,如果需要用按键来控制焦点的话需要先把焦点设到父对话框,再设到控件上。
      • c)如果子对话框比父对话框小的话,比如密码输入界面。因为父窗体其实是存在的,触摸实际上能够点到,因此需要模态化子窗体(在未关闭前不允许点击其他界面) WM_MakeModal(password_hWin);
      • d)子窗体会限制在父窗体大小范围内,像之前密码输入窗体之后再创建一个全屏子窗体的话将显示不了。可以删除密码输入窗体,同时子窗体建立在上一级父窗体之下。
    5. 触摸处理过程:
      • 入口函数GUI_TOUCH_Exec();需要循环调用
      • 之后得到XY的触摸值的边界值,在GUITouch.Conf.h中定义,校准触摸也通常修改里面的
      • 读XY的触摸值,在触摸驱动做了阀值取平均值等处理了。

      • 最后看XY是否交换和转换成LCD实际的坐标值并存储起来。

      • _StoreUnstable(x,y);函数中先保存一个值,后来的值与之前的值比较有一定变化再执行处理机制(消抖)。最终会把数据存到_State这个结构变量里面。触摸的消息都是基于_State.Pressed来执行的。

      • 修改了ucgui的校准算法,使用tslib5点校准。就需要修改GUI_TOUCH_Exec();其中_AD2X()与_AD2Y()是把触摸值转换到对应LCD点的函数,需要修改成校准后的算法函数。
    6. 自定义消息:
      • 自定义消息方式如下图,给定要传递的窗口和消息ID,然后在需要的时候发送,并在对应的窗口回调函数来处理即可。

    7. TIPs:
      • 父窗口与子窗口关系:关闭或隐藏父窗口,其子窗口也同样被关闭或隐藏。隐藏的话下次显示还可以保留上次退出时的界面。
      • 在其他任务里要显示窗口和关闭窗口,要注意任务堆栈的大小。
      • 两个独立的窗口要互相显示的时候,关闭窗口好像有bug,可以用隐藏另一个窗口来实现显示。
      • 定义窗口句柄为全局变量可方便随意隐藏、显示、关闭窗口。
      • 新建立的窗口为焦点窗口,即所有消息都在本窗口回调函数处理。
      •  WM_MakeModal(); // 模态化,即不能点击其他窗口,除非关闭自己。
      • _ExecCalibration();//触摸校准,在demo程序里。
      • 控件输入的值是ascii
    8. ucgui背景图片与按键图片显示解决思路:
      • 整个背景就一张图片。没有控件。---解决触摸回调方法
      • 背景图片加控件图片---解决背景图片重绘方法,透明都不可用
      • 结论:第2个思路没有找到方法,没有这么大的RAM来显示图片,如果需要图片只能不用ucgui了直接硬件画图。主要原因不了解uigui画图的机制。第一个思路没有找到在回调函数处理的办法,但是可以建立一个任务来处理。如下:
    9. 按键处理菜单:
      • 使用如下函数,按键切换焦点。
      • WM_HWIN WM_SetFocusOnNextChild (WM_HWIN hParent); /* Set the focus to the next child */
      • WM_HWIN WM_SetFocusOnPrevChild (WM_HWIN hParent);
      • 关闭子窗体后,没有了焦点窗口,必须重设焦点窗口
      • hWin = WM_GetParent(WM_GetFocussedWindow());
      • WM_SetFocusOnPrevChild (hWin);//焦点切换
      • MES_p.hWin = WM_GetParent(MES_p.hWinSrc);
      • MES_p.Data.v = WM_NOTIFICATION_RELEASED;//因为触摸里面的回调函数都完成了,使用触摸的接口。
      • WM_SendMessage(MES_p.hWin,&MES_p);//发送消息,回调函数去处理
      • **_SetFocussable()可禁止设为焦点
      • 虚拟成ps2鼠标,见:http://www.amobbs.com/thread-4948610-1-1.html,不过这种方法一次只能移动固定像素点,比较局限性。
    10. 窗体和框架页句柄的区别:(对话框是窗体创建的)
      • hWinMap=FRAMEWIN_Create("Map to Segger Hilden", &_cbWinHouse2, WM_CF_SHOW, 0, 18, 240, 306);//新建窗口并设置回调
      • _changdingyi=WM_GetClientWindow(hWinMap);//获得用户区窗口句柄
      • 用户自定义消息发送必须使用下面获得的句柄
      • 如果创建的WM窗口,这两个句柄就是同一个
      • WM_GetParent(WM_GetFocussedWindow());//得到framewin用户区窗口句柄---自定义消息发送需要用到这个
    11. 其他:
      • ucgui下制作漂亮按键 .http://www.amobbs.com/thread-5551143-1-1.html
      • UCGUI对话框中显示图片的问题?http://bbs.21ic.com/icview-436955-1-1.html
      • uCGUI 按键窗口切换机制.http://www.cnblogs.com/hiker-blogs/p/3166080.html
      • ucGUI390 触摸消息响应过程.http://blog.csdn.net/yhmhappy2006/article/details/1438899
      • UCGUI添加外置字库到SD卡。http://www.openedv.com/posts/list/21784.htm
      • 字库相关:
      • 编码格式:GB2312、GBK(向下兼容GB2312)
      • 机内码与区位码的关系(GB2312):高字节内码=高字节国标码+80H=区码+20H+80H=区码+0A0H=区码+160。低字节内码=低字节国标码+80H=位码+20H+80H=位码+0A0H=位码+160。
      • GB2312与GBK里面的西文字符都是全角格式,也就是2个字节来表示一个字母。如果采用半角字符就需要在ASCII里面找字库了。
      • 标准的中文字库计算方式如下:『GBK』offset = ((hz[0] - 0x81) * 190 + (hz[1] - 0x40) - (hz[1] / 128)) * 点阵占用字节;『GB2312』offset = ((hz[0] - 161) * 94 + (hz[1] - 161)) * 点阵占用字节;『ASCII』offset = (hz[0] - 0x20)*点阵占用字节;其中,点阵占用字节就是每个字占用的字节数(比如32位中文字符就是(32/8)×32,16位半角英文是(8/8)×16)。

      • 旋转: page314
      • 按键回调:page364
      • 消息提示框:page749
1 0