资源描述:
《ucgui中的窗口管理机制以及解决独立窗口并存的方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、修改UCGUI源代码以支持多个独立窗体的说明发布时间:2008-11-17 来源:来自网络 作者:匿名 浏览:2868问题的提出:关于对话框对话框处理程序中,ok按钮按下后想出现一个消息框。但直接加在程序中好像不行,该怎么办?[独立窗体]------指该窗体的父窗体不是用户创建窗体,在UCGUI中其父窗体为句柄为1.一,消息处理的流程.ucgui是采用的消息驱动的.它专门有对外的一套采集消息的接口,我在模似器中,就是通过LCD窗口的MOUSE消息,将MOUSE移动,点击消息传入到这个接口中,以驱动UCGU
2、I中的事件的..UCGUI中的消息驱动,其实与WINDOWS的是类似的,几种基本的消息与WINDOWS是一样的,但UCGUI的更简单,消息更少,没有WINDOWS那么多的消息种类.在WINDOWS中,我们最简单处理按钮事件的是在WM_COMMAND消息中,通过按钮的标志ID来处理不同的按钮,所以,我们的按钮的标志ID都是不同的.要不然无*区别开的.要处理点击OK这个按钮的事件,UCGUI的处理方*有些不同,是在WM_NOTIFY_PARENT消息中处理:caseWM_NOTIFY_PARENT:Id=WM_GetI
3、d(pMsg->hWinSrc);/*Idofwidget*/NCode=pMsg->Data.v;/*Notificationcode*/switch(NCode){caseWM_NOTIFICATION_RELEASED:/*Reactonlyifreleased*/if(Id==GUI_ID_OK){/*OKButton*/GUI_EndDialog(hWin,0);}if(Id==GUI_ID_CANCEL){/*CancelButton*/GUI_EndDialog(hWin,1);}break;}bre
4、ak;ucgui中的消息非常的少,只有差不多不到二十种,其实这对于嵌入式系统来说,已经完全足够了,用户可以自定义消息,WM_NOTIFY_PARENT这个消息是由你窗体传送过来的,是由函数WM_NotifyParent(hObj,Notification)实现的.voidWM_NotifyParent(WM_HWINhWin,intNotification){WM_MESSAGEMsg;Msg.MsgId=WM_NOTIFY_PARENT;Msg.Data.v=Notification;WM_SendToParen
5、t(hWin,&Msg);}这个函数相当简单,其主要还是WM_SendToParent这个函数的调用,这个函数又调用voidWM_SendMessage(WM_HWINhWin,WM_MESSAGE*pMsg),这个函数是最基本的一个消息处理函数,它的第一个参数指定了接受这个要处理的消息的句柄,第二个指定了是什么消息.这个函数的主要作是,是调用相就窗口的消息处理函数来处理消息.比如说,在这里,我们这个消息的处理过程是这样的,首先,你左键点击OK按钮,那么在GUI_Exec()这个窗体消息LOOP处理当中,首先将此消
6、息(WM_TOUCH)传给OK按钮(注意这也是一个窗体),然后,OK按钮的消息处理函数将此消息再以WM_NOTIFY_PARENT传送到你窗体---对话框当中,这样,对话框就可以处理到点击OK按扭这个事件了...其实这个消息处理的流程与WINDOWS也是类似的.原理一样..理解了这个过程,那么,我们就可以这个消息中处理很多东西了,只要是在对话框中的子控件,一般的消息都可以如此处理.二,发现存在的问题----两个独立的窗口并立时,当关闭其中一个,另外一个不再有响应.在如下代码中处理弹出消息框,点击对话框的OK后弹出消
7、息框,会出现当按对话框的Cancel关闭对话框后,弹出的消息框就没有任何响应的情况.或者是关闭掉弹出的消息框,对话框就没有任何响应的情形.caseWM_NOTIFY_PARENT:Id=WM_GetId(pMsg->hWinSrc);/*Idofwidget*/NCode=pMsg->Data.v;/*Notificationcode*/switch(NCode){caseWM_NOTIFICATION_RELEASED:/*Reactonlyifreleased*/if(Id==GUI_ID_OK){/*OKBu
8、tton*//弹出消息框...GUI_MessageBox("Thistextisshowninamessagebox","Caption/Title",GUI_MESSAGEBOX_CF_MOVEABLE);GUI_EndDialog(hWin,0);}if(Id==GUI_ID_CANCEL){GUI_EndDialog(hWin,1);}break