ucGUI的视窗管理回调机制学习

摘要:
熟悉窗口的回调机制,重点了解回调函数的功能和消息传递机制。uC/GUI的窗口管理是一个单独的软件,而不是uC/GUI中的基本组件。回调机制uC/GUI在窗口和窗口控件的回调机制后面提供了一个事件驱动标志。在uC/GUI中,在窗口管理中使用back机制来重新绘制控制窗口,这使得窗口管理的有效性成为可能。回调函数的使用当使用回调函数创建窗口时,必须有一个回调函数。回调函数执行的函数取决于接收到的消息。

要熟悉窗口的回调机制,重点理解回调函数作用,消息传递机制。

uC/GUI的窗口管理是个单独的软件,不是uC/GUI的基本组成部分。代码见\uCGUIGUIWM。当使用uC/GUI窗口管理时,任何能显示在显示终端上的内容都包含在一个窗口里面,这个窗口是LCD屏幕上的一个给用户画图或显示目标的区域。窗口能够是任何尺寸的,能够一次在屏幕上显示多个窗口,也能够在其他窗口当中或之前显示窗口。

  1. 窗口管理的几个名词:
  • 活动窗口:
    当前正在用来画图或是显示操作的窗口。
  • 回调函数
    回调函数是由用户定义的,当特定事件发生时,指示图像系统调用特定函数的函数。通常当窗口的内容发生改变时,他们用来自动重绘窗口。例如,窗口内显示一幅位图,当窗口移动时,位图并不会自动移动,此时,就需要调用回调函数对窗口进行重绘,即,从观众的角度来看,移动窗口和窗口内容。
  • /父窗口
    子窗口是相对于父窗口定义的窗口。无论何时,只要父窗口移动,则子窗口们都要相应移动。子窗口被父窗口完全包含。拥有同一个父窗口的子窗口们互相间称为兄弟。
  • 客户区
    窗口的客户区就是窗口的可用区。假如窗口包含方框或标题栏,则客户区就是方框或标题栏的内部区域。
  • 句柄
    当一个新的窗口被创建时,WM分配一个唯一的标识符,称为句柄。句柄用在后续对该窗口操作的任何函数中,而且能够利用该句柄唯一标识该窗口。
  • 有效窗口/无效窗口
    有效窗口是个已完全更新,无需重绘的窗口。不管是完全重绘还是局部重绘。当窗口内容发生改变时,WM则标识窗口无效。下一次重绘之后(调用回调函数),窗口又变为有效。
  1. 回调机制

uC/GUI提供给窗口和窗口控件的回调机制的背后,是一个事件驱动标志。在大多数的窗口系统中,流控不但仅时从用户程式到图像系统,而且还要能够从用户程式到图像系统,并且能够通过用户程式提供的回调函数,返回到用户程式。这个机制,就称为回调机制。在uC/GUI中,回到机制用来在窗口管理中出控制窗口的重绘操作,这使得窗口管理的有效性成为可能。

  1. 回调函数的使用

使用回调函数建立一个窗口时,必须有一个回调函数。所用的回调函数必须有如下原型:

void callback(WM_MESSAGE *pMsg)其中pMsg为指向消息的指针。回调函数执行的功能依赖于所接收到的消息。以上原型后一般跟着switch表达式,表达式定义不同的case表达式下不同的信息对应的不同行为,至少要有一个重绘函数:WM_PAINT()。如程式清单4.1,建立一个自动更新窗口的回调函数

程式清单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所示:

程式清单4.2回调函数

#include"GUI.H"

/* 背景窗的回调函数*/

static voidcbBackgroundWin(WM_MESSAGE* pMsg) 
{
switch(pMsg->MsgId) 
{
caseWM_PAINT:    GUI_Clear();
default:         WM_DefaultProc(pMsg);
}
}

/* 前景窗的回调函数*/

static voidcbForegroundWin(WM_MESSAGE* pMsg) 
{
switch(pMsg->MsgId) 
{
caseWM_PAINT:    GUI_SetBkColor(GUI_GREEN);
GUI_Clear();
GUI_DispString("Foregroundwindow");
default:         WM_DefaultProc(pMsg);
}
}
/*  回调机制 */
static voidDemoRedraw(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("Backgroundof 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);
}
}
voidmain(void) 
{
GUI_Init();
DemoRedraw();
}

4.3.4消息传递机制

程式清单4.2中,回调函数执行的功能依赖于所接收到的消息。Switch语句中根据消息的类型,分别执行不同的功能。

WM_MESSAGE的成员如下:

MsgId:消息类型

HWin:目的窗口

HWinSrc: 源窗口

Data.p : 数据指针

Data.v: 数据值

其中MsgId的类型如下:

WM_PAINT: 窗口重绘

WM_CREATE: 窗口一建立就发送

WM_DELETE: 窗口一删除就发送

WM_SIZE :窗口尺寸发生改变就发送

WM_MOVE :窗口移动就发送

WM_SHOW :接收到show命令就发送

WM_HIDE :接收到hide命令就发送

WM_TOUCH:触摸屏信息

应用程式还能够为自己定义额外的消息。为确保他们不用到uC/GUI的消息ID,用户定义的消息从WM_USER后面开始,如:

#defineMY_MESSAGE_AAA WM_USER +0

#defineMY_MESSAGE_BBB WM_USER +

免责声明:文章转载自《ucGUI的视窗管理回调机制学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sqlmap参数详解ViewPager+TabLayout+Fragment刷新Fragment中的数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

自己画WinForm 皮肤包括默认控件

好久没来博客园,今天捣鼓到现在就是为了把之前的皮肤控件完善好, 之前也看了很多技术文章,大多数都是自己重写系统控件实现换肤,几乎没有像东日的(IrisSkin)控件一样 添加一个组件 把系统的皮肤全换掉,我曾经也是重写系统的控件,但我就喜欢瞎捣鼓,于是就开始找这方面的资料,苦于没学过底层,对windows窗口 以及消息循环机制不了解,找资料也基本上白搭了许...

CAT 监控搭建

简介 CAT 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。 开源地址:https://github.com/dianping/cat/ D...

在MDK中使用 printf 函数

microlib 提供了一个有限的 stdio 子系统,它仅支持未缓冲的 stdin、stdout 和 stderr。 这样,即可使用 printf() 来显示应用程序中的诊断消息。 要使用高级 I/O 函数,您必须提供自己实现的以下基本函数,以便与您自己的 I/O 设备配合使用。 fputc()  为所有输出函数实现此基本函数。 例如,fprintf(...

【Win 10 应用开发】MIDI 音乐合成——音符消息篇

在上一篇中,老周介绍了一些乐理知识,有了那些常识后,进行 MIDI 编程就简单得多了。尽管微软已经把 API 封装好,用起来也很简单,但是,如果你没有相应的音乐知识基础,你是无法进行 MIDI 编程的。 这一篇老周将给你讲述一下如何让你的声卡播放一个音符,这会包含两条消息,而且这两条消息是很常用的。 1、Note On:让 MIDI 设备(如果没有专业设备...

Window.requestAnimationFrame()动画更新

概述 Window.requestAnimationFrame()方法告诉浏览器你希望执行动画,并且再下一次重绘之前要求浏览器调用一个特定的函数去更新动画。该方法把一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。 注意:如果你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用Window.requestAnimationF...

4、LayIM 开发者文档

一、配置文档目录 1、好友列表状态 2、当前会话状态 3、查看群成员 4、业务暂无此必要 5、发送消息 6、接受消息 7、监听我主面板的在线状态 8、弹出申请好友面板(业务场景用于好友添加需申请) 9、弹出添加好友面板(业务场景可以直接添加好友)...