许式伟的架构课
许式伟
七牛云 CEO
84945 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 89 讲
许式伟的架构课
15
15
1.0x
00:00/00:00
登录|注册

21 | 图形界面程序的框架

委托
事件处理类
架构师的决策能力
不同平台的优先级
跨平台桌面应用程序的挑战
差异性最大的子系统
桌面应用程序的特点
跨平台开发的坑
基础控件
GDI优化和硬件加速
跨平台的难易程度
GDI子系统
2D和3D内容
事件处理链
事件分派循环
事件分派过程
应用程序级别事件
特殊事件:onPaint或onDraw
响应事件的机制
窗口/视图
事件放入目标进程的事件队列
事件产生过程
全局事件队列
总结
通用控件
窗口内容绘制
事件分派
窗口与事件响应
事件
图形界面程序的框架

该思维导图由 AI 生成,仅供参考

你好,我是七牛云许式伟。
上一讲我们回顾了交互的演化历程。今天,我们将关注点收敛到现在仍然占主流地位的图形界面程序。它的结构如下图所示。
实现一个图形界面程序,最大的复杂性在于不同操作系统的使用接口完全不同,差异非常巨大。这给开发一个跨平台的图形界面程序带来巨大挑战。
好在,尽管操作系统的使用接口有异,但基本的大逻辑差不多。今天我们从统一的视角来看待,谈谈图形界面程序的框架。

事件

无论是什么桌面操作系统,每个进程都有一个全局的事件队列(Event Queue)。当我们在键盘上按了一个键、移动或者点击鼠标、触摸屏幕等等,都会产生一个事件(Event),并由操作系统负责将它扔到进程的事件队列。整个过程大体如下。
键盘、鼠标、触摸屏等硬件产生了一个硬件中断;
操作系统的硬件中断处理程序收到对应的事件(Event);
确定该事件的目标进程;
将事件放入目标进程的事件队列(Event Queue)。

窗口与事件响应

窗口(Window),也有人会把它叫视图(View),是一个独立可复用的界面元素(UI Element)。一个窗口响应发送给它的事件(Event),修改内部的状态,然后调用 GDI 绘制子系统更新界面显示。
响应事件的常见机制有两种。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了图形界面程序的框架,从事件、窗口与事件响应、事件分派、窗口内容绘制和通用控件等方面展开详细讨论。图形界面程序中的事件由硬件产生并由操作系统负责放入进程的事件队列,窗口则是一个独立可复用的界面元素,响应发送给它的事件并修改内部状态。事件分派由事件分派循环完成,窗口内容绘制需要操作系统的GDI子系统。此外,操作系统还提供了一些通用的界面元素,如静态文本、按钮、单选框等,以简化开发过程。桌面应用程序通常由用户交互所驱动,而跨平台的桌面应用程序开发面临着多样的平台和差异性挑战。文章提供了对比表格和列举了不同平台,强调了跨平台开发的复杂性和挑战。未来版本的迭代计划和跨平台方案选择都需要架构师的决策能力。整体而言,本文为读者提供了全面的了解,使其能够更好地理解和应用图形界面程序的开发。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《许式伟的架构课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • sam
    高屋建瓴的视觉,大部分做应用层开发的同学缺乏这个视角的了解,感谢许老师! 是不是只有从这个角度了解了系统,才能更好的开发一套应用系统出来?还需要哪些知识的了解?

    作者回复: 以上两讲是基础的背景知识,下一讲更为关键一些。

    2019-07-03
    13
  • tokamak
    许老师,你好。Qt里面的信号和槽机制非常好用,实现了两个对象的同步通信和异步通信。您觉得信号和槽的性能和实时性怎么样?

    作者回复: qt 的 signal-slot 其实就是一种 delegate 机制

    2019-07-02
    8
  • Geek_88604f
    GUI程序逐渐被WEB应用程序替代,这里有哪些原因,许老师?

    作者回复: 下一讲会谈这个话题

    2019-07-06
    2
    5
  • ljf10000
    “操作系统的硬件中断处理程序收到对应的事件(Event); 确定该事件的目标进程;” 如何确定目标进程呢?中断处理过程中获取当前系统的焦点进程?这里会有时间差啊。 如果我按了alt+F4本意是关闭当前程序,而按键前后被病毒或流氓软件弹出新的窗口(独立进程),那么关闭的是谁?

    作者回复: 以上过程有省略,操作系统一级也是有键盘事件缓存的。有时候系统比较卡的时候我们按键盘主机的内置会有提示音,这是操作系统键盘缓冲满你的按键被丢弃的意思。至于确定目标窗口存在误差,这个从交互来说不是大问题

    2019-07-02
    4
  • wentworthhu
    老师,文章中提到“修改内部的状态,然后调用 GDI 绘制子系统更新界面显示”,其中涉及的GDI,我理解特指windows上。前面提到的Event等都不区分操作系统的,为啥提到图形绘制说GDI,那OpenGL不也是一种吗?为啥此处特指GDI呢,有点困惑。

    作者回复: 这里gdi是泛指。opengl也是一种gdi接口。

    2019-08-18
    2
  • 靠人品去赢
    老师,如果做一个大的中间层来处理系统差异(类似硬件中我们处理硬件差异,驱动管理一样)。每个系统对应一个驱动来处理跨平台,会不会好一点,这种方案难点在哪?像Java,flutter跨平台的原理?

    作者回复: 后面会谈跨平台

    2019-07-04
    2
  • eletarior
    最近在研究Google的flutter框架,凭着其一统桌面端开发的野心,就值得好好学习下。从开发语言到框架都不同以往。不过本着太阳下没有新事物的原则,从消息循环到事件的响应开始深挖型学习,一切问题都不是事了。
    2019-07-02
    9
  • 程序员小跃
    如果不是当初开发过Android App,这一节课的知识,看起来就不会那么顺了。事件分发、Looper、控件等等,庆幸自己搞过客户端开发
    2019-07-10
    1
    6
  • Akon Convict
    醍醐灌顶 ,底层系统设计的思想大体是一致的!
    2019-07-03
    4
  • 不温暖啊不纯良
    窗口与窗口之间的协作是通过操作系统来完成的,操作系统在这里起到了一个中间人的功能,但是你要是光看窗口系统本身是构很简洁的,一个四方形,通过事件来完成放大/缩小/拖拽/渲染内容,然后外加一个可复用,就能够满足几乎所有的用户操作,这个事情本身就很神奇,要是不了解其中的原理,会觉得窗户系统就是整个互联网.错综复杂. 它的设计有点像,把人的视觉范围用一个框子框起来,现实中人要切换视角,需要扭头,而在计算机上,连扭头都不用. 相似的是,人的大脑就像是操作系统,当需要切换视角,大脑会调用颈部神经和肌肉,进行转动,这里的触发器是一个念头.
    2021-04-06
    1
    2
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部