那么该TIMER句柄为什么不是pMsg-hWinSrc?因为TIMER不是一个控件或窗口

时间:2022-05-20 04:42:26

标签:

备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果。(2)看完教程000~005就根基会用emWin做项目,其他章节可以需要时再参考。
  emWin的控件具有聚焦(Focus)成果,聚焦成果对付操纵界面来说有时候是不需要的,但有时候是必不成少的。好比需要用键盘操纵界面时,没有控件聚焦就没法决定操纵哪个控件了,有聚焦的话可以通过TAB键将焦点移动到需要操纵的控件,然后执行需要的操纵。控件聚焦是emWin内部本身措置惩罚惩罚的,我们作为用户是不需要理会的,但有时候我们需要将聚焦指定到哪个特定控件,我们就可以用WM_SetFocus()函数实现。
  动静是emWin的根基元素,emWin是通过动静和我们本身的措施交互的,emWin可以动员静通知我们什么工作产生了,固然我们也可以发送动静给emWin报告它要做什么。emWin有固定的动静,好比:WM_INIT_DIALOG(创建窗体时通知我们需要设置控件哪些参数)、WM_PAINT(通知我们窗体刷新绘制完毕)、WM_NOTIFY_PARENT(通知我们有控件被点击)等等…;固然emWin还可以让我们本身界说动静,这个长短常有用的,好比你在措施某个处所需要通知某个窗体做什么转变,这个时候你就本身界说一个动静,然后用WM_SendMessage()函数向这个窗体发送动静,在这个窗体的回调函数中插手这个动静和需要措置惩罚惩罚的工作即可。
  在例程中,点击”FocusTo Edit”之后,本该聚焦到该按键的,但在措施中使用WM_SetFocus()函数将焦点指定到了Edit控件;点击”Send Message”按键之后,在措施中使用WM_SendMessage()函数发送一个WM_MSGUSER动静给本身的父窗口,再在WM_MSGUSER动静中转变Edit的值(这样做只是举例而已,其实是可以直接转变Edit的值)。

  此外,如果你用到键盘控制界面的话,聚焦就非常重要了!如果一个页面掉去聚焦的话,页面将无法响应键盘的操纵,措施也无法跑到按键触动员静(WM_KEY)!在例程措施中,WM_HideWindow()和WM_ShowWindow()之后,页面并不会聚焦到当前页面,插手下面的函数就是为了聚焦到当前页面:

那么该TIMER句柄为什么不是pMsg-hWinSrc?因为TIMER不是一个控件或窗口


那么该TIMER句柄为什么不是pMsg-hWinSrc?因为TIMER不是一个控件或窗口



因为ID_BUTTON_0控件是在Framewin的Client窗口(有疑问请看:教程003),而hPage[1]是Framewin主窗口的句柄,因此要获取ID_BUTTON_0控件的句柄应该怎么做?在emWin中理解Framewin的Client区观点长短常须要的(其实就是记得有一个Client区就行)!

那么该TIMER句柄为什么不是pMsg-hWinSrc?因为TIMER不是一个控件或窗口



在emWin的仿单描述中,,动静实际上是一个布局体,并且以pMsg指针的形式通报给回调函数:
static void_cbDialog(WM_MESSAGE * pMsg)
{
  ......
}

那么该TIMER句柄为什么不是pMsg-hWinSrc?因为TIMER不是一个控件或窗口



1)MsgId暗示是什么动静,好比emWin的固定动静:WM_INIT_DIALOG(创建窗体时通知我们需要设置控件哪些参数)、WM_PAINT(通知我们窗体刷新绘制完毕)、WM_NOTIFY_PARENT(通知我们有控件被点击)等等…,固然还可以是我们本身起名的动静:
message.MsgId =WM_MSGUSER;
WM_SendMessage(hWin,&message);

2) hWin是方针窗口句柄,即要发送动静到哪个窗口:
WM_SendMessage(hWin,&message);
需要注意的是要区分好哪个才是方针窗口,好比是要发送给hFramewin的主窗口还是发送给hFramewin的Client窗口:
WM_SendMessage(hFramewin,&message);
WM_SendMessage(WM_GetClientWindow(hFramewin),&message);

但是对付pMsg->hWin,不管static void _cbDialog(WM_MESSAGE* pMsg)是Framewin主窗口的回调函数还是Client窗口的回调函数,pMsg->hWin暗示的都是Framewin主窗口的句柄(感受奇怪也没步伐,emWin就是这样设计的)。


3) hWinSrc是源窗口/控件句柄,即动静是由谁发出的,在回调函数中有下面一句措施,用来获取发出动静的阿谁控件的ID:
Id = WM_GetId(pMsg->hWinSrc);
好比当你按下一个Button控件,在emWin底层内部,会发送一个动静到这个按键的父窗口,那么pMsg->hWinSrc自然就是这个Button的句柄。

4)在你要向某个窗口发送动静的时候,还想附带个数据怎么办?这时候就可以用到Data.v或Data.p元素,Data.v可以储存一个数,Data.p可以指向一个数据群。
好比在TIMER例程中有这样一句话:WM_RestartTimer(pMsg->Data.v,100);,在emWin底层内部,emWin把TIMER的句柄存到Data.v了,既然这个动静是TIMER发出的,那么该TIMER句柄为什么不是pMsg->hWinSrc?因为TIMER不是一个控件或窗口,所以把句柄存到Data.v传过去。


源码/软件下载

emWin 2天速成实例教程005_控件聚焦和用户动静的使用要领