|
客户区
窗口的客户区就是窗口的可用区。如果窗口包含方框或标题栏,则客户区就是方框或标题栏的内部区域。
句柄
当一个新的窗口被创建时,WM分配一个唯一的标识符,称为句柄。句柄用在后续对该窗口操作的所有函数中,而且可以利用该句柄唯一标识该窗口。
有效窗口/无效窗口
有效窗口是一个已经完全更新,不需要重绘的窗口。不管是完全重绘还是局部重绘。当窗口内容发生改变时,WM则标识窗口无效。下一次重绘之后(调用回调函数),窗口又变为有效。
回调机制
uC/GUI提供给窗口和窗口控件的回调机制的背后,是一个事件驱动标志。在大多数的窗口系统中,流控不仅仅时从用户程序到图形系统,而且还要能够从用户程序到图形系统,并且能够通过用户程序提供的回调函数,返回到用户程序。这个机制,就称为回调机制。在uC/GUI中,回到机制用来在窗口管理中出控制窗口的重绘操作,这使得窗口管理的有效性成为可能。
回调函数的使用
使用回调函数建立一个窗口时,必须有一个回调函数。所用的回调函数必须有如下原型:
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 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(); } 消息传递机制
程序清单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后面开始,如:
#define MY_MESSAGE_AAA WM_USER +0 #define MY_MESSAGE_BBB WM_USER +1 (完)
共2页: 上一页 [1] 2 下一页
|