全部博文(2005)
分类: C/C++
2007-08-30 18:18:28
μC/GUI-v3.90a学习笔记7
1.GUI_DispStringAtCEOL("", 5, 55);//显示完字符串之后,将显示数据后面的空间全部擦除
2.如果当前控件作为WM__hWinFocus焦点窗体接收到了键盘key消息,那么WM_DefaultProc()消息处理函数
会将该键盘key消息发送给它的Parent,当Parent收到键盘消息之后,也按同样的方式做,传给Parent的Parent,依此类推.
3.hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);获取hDlg父窗体内,
id号为GUI_ID_EDIT0的控件对应的句柄hWin.
4.鼠标点击LCD的任何一个位置时,会计算出鼠标点击处对应的hWin窗体句柄
_Screen2hWin()函数和WM_GetDialogItem()函数类似都是使用递归调用方式,遍历所有窗体,
_Screen2hWin()函数先检查鼠标点击处是否在WM__FirstWin桌面背景窗体矩形内,
[注:WM__FirstWin是桌面背景窗体句柄],之后递归检测桌面背景窗体WM__FirstWin挂接的所有孩子及兄弟,
以及孩子的孩子的兄弟等,是否在鼠标点击处,如果找到了某个兄弟在鼠标点击处,那么会继续检查,
比当前兄弟Z序高的hWin->Next,是否也在鼠标点击处,如果是,那么说明鼠标将要激活的窗体应该是
这个Z序更高的同级兄弟窗体,反反复复之后,鼠标点击处对应的窗体句柄hWin就轻松的找到了,
鼠标的单击、双击、拖动等消息就会发送给该窗体,鼠标消息也将终止在hWin,这和键盘key消息不同,
键盘key消息会一直传递到parent的parent等,而鼠标消息将终止到hWin这里,所以对于Button控件,
接收到鼠标点击后,Button会发送WM_NOTIFY_PARENT消息给父窗体,来主动向父窗体报告自己的点击状态,
父窗体Id = WM_GetId(pMsg->hWinSrc);获取button的id号,如GUI_ID_OK,GUI_ID_CANCEL之类的,
这样父窗体就直到消息是由哪个控件传递过来的,进而也就间接的知道鼠标的动作,进而做出相应的处理.
5.对于窗体销毁
GUI_EndDialog()函数,如在frame创建时,使用了_cbCallback()"用户自定义的消息回调处理函数",那么
当frame"客户区回调函数"FRAMEWIN__cbClient(),调用之前,
if (cb) {
pMsg->hWin = hParent;//将消息目的窗体改为客户区的父窗体"标题栏和框架"窗体
(*cb)(pMsg);
}
所以在"用户自定义的消息回调处理函数"中调用GUI_EndDialog(hWin,1);时,hWin已经不是frame的客户区句柄
而是frame"标题栏和框架"句柄,所以销毁的也就不是frame的客户区,而是frame自身.
这个在GUI_MessageBox()函数中被体现的淋漓尽致.
GUI_EndDialog()最终调用WM_DeleteWindow()来删除窗体,所以如果我们需要动态删除某个控件,那么
直接调用WM_DeleteWindow()即可.
chinaunix网友2009-03-05 11:10:55
楼主,你好,向你请教个问题。我新建了一个GUI_MessageBox消息框,怎么做才能让我的一个外部按键(不是键盘)和“OK”按钮对应上呢,也就是当我这个按键按下的时候相当于这个消息框中的“OK”按钮按下了,然后销毁这个消息框。看了一些资料有的说是用WM_NOTIFY_PARENT来实现,又有的说是用WM_KEKY来实现,弄了一下还是不知道怎么个实现法,希望你能指教一下,谢谢