ucgui 窗口管理及回调函数的应用

来源:互联网 发布:数据库存储图片路径 编辑:程序博客网 时间:2024/05/20 14:23

窗口管理的几个名词

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

回调机制
uC/GUI提供给窗口和窗口控件的回调机制的背后,是一个事件驱动标志。在大多数的窗口系统中,流控不但仅时从用户程式到图像系统,而且还要能够从用户程序到图像系统,并且能够通过用户程序提供的回调函数,返
回到用户程序。这个机制,就称为回调机制。在uC/GUI中,回调机制用来在窗口管理中出控制窗口的重绘操作,这使得窗口管理的有效性成为可能。
回调函数的使用
使用回调函数建立一个窗口时,必须有一个回调函数。所用的回调函数必须有如下原型:
void callback (WM_MESSAGE *pMsg)。 其中pMsg为指向消息的指针。
回调函数执行的功能依赖于所接收到的消息。以上原型后一般跟着switch表达式,表达式定义不同的case表达式下不同的信息对应的不同行为,至少要有一个重绘函数:WM_PAINT()。如程式清单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;
}
}
使用回调函数,更为周详的示例下所示

#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();
}
原文:http://blog.sina.com.cn/s/blog_724d24bf0100tgdn.html


消息传递机制
回调函数执行的功能依赖于所接收到的消息。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后面开始,如:
#define MY_MESSAGE_AAA   WM_USER +0
#define MY_MESSAGE_BBB   WM_USER +1

0 0
原创粉丝点击