emWin 2天速成实例教程005_控件聚焦和用户消息的使用方法

备注:(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()之后,页面并不会聚焦到当前页面,加入下面的函数就是为了聚焦到当前页面:

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

在emWin的说明书描述中,消息实际上是一个结构体,并且以pMsg指针的形式传递给回调函数:
static void_cbDialog(WM_MESSAGE * pMsg)
{
  ......
}

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传过去。

源码/软件下载

原文地址:http://blog.51cto.com/neqee/2084575

时间: 2024-11-09 00:48:49

emWin 2天速成实例教程005_控件聚焦和用户消息的使用方法的相关文章

emWin 2天速成实例教程003_Framewin和Window窗口控件和2D绘图

备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果.(2)看完教程000-005就基本会用emWin做项目,其他章节可以需要时再参考. (1) emWin的每个界面都需要一个Framewin/Window窗口控件作为父窗体,就好像Framewin/Window是一个窗体框架,所有控件都放置在这个框架当中,组成父窗体和子控件的连带关系,可以通过父窗体找到子控件,也可以通过子控件找到它的父窗体,Framewin和Window在外观上是有区别的:

emWin 2天速成实例教程004_软件定时器(Timer)和位图片动画

备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果.(2)看完教程000-005就基本会用emWin做项目,其他章节可以需要时再参考.  emWin的TIMER是一个软件定时器,它以OS_TimeMS变量的值作为定时基准,而OS_TimeMS则通过一个硬件定时器每1ms中断加1,在emWin内部程序不断查询OS_TimeMS的变化实现软件定时.  在很多应用场合,我们需要用到定时器,比如每隔一定时间查询某一事件有没有被触发,每隔一定时间改变

emWin 2天速成实例教程002_多个页面窗口切换

备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果.(2)看完教程000-005就基本会用emWin做项目,其他章节可以需要时再参考.  用emWin做界面,可以简单理解为每个C文件即对应一个页面,如果要设计多个页面的界面怎么办?生成多个界面C文件并在回调函数的操作触发消息中用隐藏/显示页面函数:WM_HideWindow()和WM_ShowWindow()实现界面切换程序即可.  当界面有多个页面需要切换显示时,有两种方式可以实现:(1)

MFC入门教程之控件(7)设备自动检测ondevicechange的添加和使用

MFC入门学习(1)了解MFC 源文档<http://blog.csdn.net/codectq/article/details/19131227> MFC入门学习之控件(2)创建一个对话框窗口并在运行时显示 源文档<http://blog.csdn.net/codectq/article/details/19131289> MFC入门学习之控件(3)标签控件Tab Control的添加和使用 源文档<http://blog.csdn.net/codectq/article/

DWZ (JUI) 教程 tree 控件的选中事件

原文:DWZ (JUI) 教程 tree 控件的选中事件 先简单说一下流程 第一步 当然是先定义好回调事件了 function checkCallback(json){ ........... ........... } 关键是回调函数返回的结构 {checked:布尔值, items:数组} 如果是选中事件 checked 为 true 否则为false items 是个对象数组 [ {name:, value:, text: },{} ]   是返回是选中的节点,如果返回的checked 为

零元学Expression Blend 4 - Chapter 16 用实例了解交互控件&ldquo;Button&rdquo;II

本章将教大家如何制作自己的Button,并以玻璃质感Button为实践案例. 本章将教大家如何制作自己的Button,并以玻璃质感Button为实践案例 01 拉出一个圆 请以Ellipse拖拉出一个圆形,并修改圆形的颜色 范例: Fill->Gradient brush->Radial gradient(0%.#FFFF0000)(100%#FF000000) 02 把圆形转换成控件 选取圆形,并且在圆形上单击鼠标右键->Make Into Control 点选Button以及命名完成

【转载】OLE控件在Direct3D中的渲染方法

原文:OLE控件在Direct3D中的渲染方法 Windows上的图形绘制是基于GDI的, 而Direct3D并不是, 所以, 要在3D窗口中显示一些Windows中的控件会有很多问题 那么, 有什么办法让GDI绘制的内容在3D中显示出来?反正都是图像, 总有办法实现的嘛! 前段时间在研究浏览器在游戏中的嵌入, 基本的思路就是在后台打开一个浏览窗口, 然后把它显示的内容拷贝到一张纹理上, 再把纹理在D3D中绘制出来, 至于事件处理就要另做文章了. 所以, 其它的Windows里的GDI绘制的东西

asp.net 不用控件 循环输出数据库数据的方法

不使用什么repeater gridview之类的控件,怎么才能输出数据库的数据到一个table ,我用response.write在后台,拼接 table 代码可以输出 但总是在页面的最上面 , 是不是要在aspx页面相应位置用<% %> 循环输出 但又提示找不到我后台填充的DATASET,因为听说公司做asp.net是不用控件的,想知道他们是怎么做输出数据库表格的,还请高手帮帮忙,谢谢了. 不明白来问我后台代码public string test = "";    pr

WebBrowser控件默认使用IE9,IE10的方法

最近为了抓取淘宝的成交数据,用C#的WebBrowser控件开发了一个简单的程序. 发现WebBrowser控件默认使用的版本是IE7的兼容模式.而淘宝的宝贝详细页居然对IE7的支持不是很好. 成交记录无法显示,而我本机安装的是IE10,那么有没有办法使我的WebBrowser控件的使用的IE版本高点呢? 查找到了MSDN的一篇文章,上面有详细的说明,简单翻译如下: 1,打开注册表 HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)     SOFTWARE