消息驱动机制:
windows为例,比如当你点击file菜单时,这个动作首先被操作系统捕获,而不是应用程序。经分析 Windows知道这个动作由那个应用程序处理,然后Windows发送WM_COMMAND消息给应用程序,告诉它你点击了file菜单。应用程序得到这一消息后,便采取相应的动作响应,进行消息处理。 也就是说Windows时刻监视着用户的每个动作,分析这个动作和哪个应用程序有关,然后通过消息的形式告诉它,应用程序也时刻等着消息的到来,一旦发现消息队列中有未处理的消息,就会获取消息的内容采取相应的响应。
关于WM_MESSAGE 的数据结构
typedef struct
{
int MsgId; // type of message
WM_HWIM hWin; // destination of window
WM_HWIN hWinsrc; //source of window
union
{
const void *p
int v;
GUI_COLOR color;
} Data;
}
UC/GUI的一些基本消息:
WM_CREATE——窗体创建消息。每创建一个窗体后都会向该窗体法从此消息,但在UCGUI中对于此消息的处理很少。如果用户想在对话框后做些初始化的操作或者创建其他子窗体,可以处理此消息,不过对话框一般有专门的初始化消息WM_INIT_DIALOG。
WM_SHOW——显示窗体消息。此消息在UCGUI中各控件窗体内均未作处理。
WM_SET_ENABLE——设置窗体不能使用消息。不过请注意,UCGUI中有些窗体为不可改变的
WM_PAINT——窗体重绘消息。当窗体所在区域全部或者部分无效时,系统将会发出该重绘消息,将该窗体重绘。如果用户想要在窗体上画出一些信息,一般都在该消息当中操作。UCGUI中提供的各种系统空间都必须在其系统系统提供的消息回调函数中处理此消息来绘出控件。当由外部输入操作使部分窗体无效时,系统都会在消息处理中发送该消息到窗体消息回调函数中,以重绘此窗体。
WM_TOUCH——处理MOUSE或者触摸屏等滑动操作方式的输入外设的消息。该消息中必须包含消息在屏幕中的发生位置坐标及输入设备状态(按下状态或弹起状态)。此消息在任务消息循环中处理,一旦产生就会发送给当前焦点窗体。
WM_KEY——处理按键式操作的输入外设的消息。消息中须包含按键的按下或弹起状态。此消息也是在任务消息循环中处理,一旦产生就会发送给当前焦点窗体。
WM_SET_FOCUS——当前焦点窗体设定消息。用户可以通过此消息来设定当前的焦点窗体。外部输入操作也会改变当前焦点窗体。
WM_NOTIFY_PARENT——此消息将子窗体的外设输入的消息传递到它的父窗体。因为一般情况下消息都是在父窗体重统一处理,所以就必须要子窗体将获取的外设输入消息传送给父窗体。
WM_DELETE——删除窗体时发送此消息。此消息在UCGUI中主要由WM_DeleteWindow()函数发送,主要清除窗体数据结构所占用内存。
用户自定义消息:
1. 首先在gui.h文件中注册消息的宏定义,方便管理。
#define WM_TIMER 0x0113 /* Timer has expired (Keep the same as WIN32) */
#define WM_WIDGET 0x0300 /* 256 messages reserved for Widget messages */
#define WM_USER 0x0400 /* Reserved for user messages ... (Keep the same as WIN32) */#define MMI_POWER_VALUE WM_USER+1
2. 发送消息
WM_MESSAGE m_Msg; //定义消息
Msg.MsgId =MMI_POWER_VALUE;
WM__SendMessageHwin,&m_Msg);
3. 接受消息
在窗口的回调函数中加入消息处理方式, 消息处理函数的switch匹配
void Callbackwin(WM_MESSAGE *pMsg) { WM_HWIN hObj = pMsg->hWin; switch(pMsg->MsgId) { caseWM_PAINT: GUI_SetBkColor(GUI_BLUE); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_FontComic24B_ASCII); GUI_SetTextAlign(GUI_TA_HCENTER|GUI_TA_VCENTER); GUI_Clear(); GUI_DispStringHCenterAt("Childwindow",//来 自:S T_M8. CN WM_GetWindowSizeX(hWin)/2, WM_GetWindowSizeY(hWin)/2); break; case PAINT:{WM_LOCK();GUI_SetBkColor(GUI_WHITE);GUI_Clear();//显示字符串GUI_SetColor(GUI_RED);GUI_SetFont(&GUI_Font8_ASCII);GUI_DispStringAt("Hello! Welcome to Desktop! " ,50,50);WM_UNLOCK();}break;case WM_TOUCH:if( (const GUI_PID_STATE*) (pMsg->Data.p) -> Pressed > 0 ){ //得到触控的点,判断int x=(const GUI_PID_STATE*) (pMsg->Data.p) -> x;int y=(const GUI_PID_STATE*) (pMsg->Data.p) -> y;if(x>50 && y>50 && x<100 && y<100){//相应的操作}} case MMI_POWER_VALUE: // 相应消息处理方式 break; } }