windos - 窗体程序

窗体线程又称为UI线程(User Interface Thread)它通过多种空间接收用户输入并显示结果,UI线程执行消息循环任务:

  1. 循环查看消息队列
  2. 获得的消息匹配到函数事件
  3. 执行函数时间
    窗体程学的要素有窗体资源、消息队列和循环结构,它负责接收用户的输入并进行结果显示。

多窗体管理

常见的管理方法

窗体管理方法特点
在窗体事件中新建其他窗体对象方法最简单,反复创建销毁浪费资源,容易产生数据冲突
使用公共类方法设置窗体显示或隐藏难度适中、切换灵活、线程控制复杂
派生ApplicationContext类,编写窗体切换方法编写难度高、切换灵活

Windows窗体资源

程序的查个体对象显示都基于桌面窗口对象,系统为每个窗体资源对象分配唯一的句柄表示。窗体资源的关系有三种划分方式:

  1. Z-order描述窗体显示的前后关系
  2. 根据资源逻辑区域划分成父子关系
  3. 代码重用的窗体类间继承关系
    桌面窗体是其他窗体的最顶级父窗体,内核函数GetDesktopWindow可获取桌面窗体资源标识。

用户输入与消息机制

Windows 平台具有两种处理键键盘与鼠标输入的方式,分别是消息机制直接输入检测方式

消息机制
消息取值功能划分

消息取值范围功能说明
0~-x3FF专由Windows操作系统使用
0x4FF~0x7FFF用户窗体类的自定义消息
0x800~0xBFFF应用程序的自定义消息
0xC000~0xFFFF应用程序的String消息
大于0xFFFF系统保留

Windows 具有一个系统消息队列按序存储全部消息,并根据规则再将消息投放到进程的消息队列中。系统为每一个窗体对象创建一个消息队列,消息经分配后由系统队列进入到窗体队列,每一个窗体对象配置一个窗体线程运行消息循环任务。消息循环反复检查消息队列中的消息,根据消息指匹配执行相应的分支代码。

Windows就有两种先进先出的消息队列,分别是系统消息队列窗体对象消息队列。消息可有系统自动派送,也可由程序主动向其他程序发送,发送方式有两种,一种方式是将消息发送到先进先出的消息队列结构中,这些消息也叫队列化消息,用户设备输入消息等就属于队列化消息,一种方式是将消息直接发送到窗体函数中,这些消息叫非队列化消息。

驱动程序将用户的键盘与鼠标的输入转化为消息结构放入系统消息队列,消息被分派到当前激活的窗体线程,窗体消息处理函数对消息进行匹配。消息队列是一个系统创建的内存对象,是动态变化的,应用程序会使用一个循环结构来处理消息队列,在每次循环时都用到GetMessage和DispatchMessage函数,GetMesage函数从当前消息队列前去除一个消息结构,DispatchMessage函数对消息进行匹配,使得系统去执行与消息对应的过程。而非队列化的消息则是直接发送到了窗体过程,表示用户激活了某个窗体。

消息机制是Windows操作系统的重要内核组成,Windows能够为每个窗体应用程序维护一个消息队列。操作系统把用户的输入统一处理为消息,派送到当前激活窗体,隐藏状态的窗体不接收用户输入。 Windows仅有一个激活窗体,用户通过键盘、鼠标产生的消息都i发送到激活窗体,最顶窗体与激活窗体有时是不同的窗体。

窗体消息重载

DefWindowsProc 函数又称为消息回调函数,它处于窗体线程的消息循环结构内,虽然每个消息仅对应一次匹配,但是耗时的操作还是会影响后续消息的接收入处理。消息回调函数是窗体程序特有的,Windows平台还支持通用回调函数机制。

默认的消息处理函数仅处理系统消息,工作线程向窗体发送自定义消息是一种有效的通信方式,SendMessage与PostMessag方法可向特定窗体发送自定义消息。窗体相应自定义消息方式是对Form类的DefWndProc成员函数进行重载。

消息结构需要填充窗体对象的句柄值,内核函数FindWindow 查找特定窗体资源,EnumWindows函数能遍历所有窗体对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值