从最早的图形用户界面操作系统Apply Lisa,到空前的windows 1.0,再到最新的Windows、苹果、Linux操作系统,图形用户界面已经是个人电脑不可缺少的部分。图形用户界面的发展是建立在成熟的图形学基础上的,本系列文章主要依托Windows 平台下的C++界面库来揭秘图形界面库原理,全方位的展现Windows界面库的发展历程和一个界面库是如何构成的。采用C++是因为系统提供的原生图形界面编程接口都是基于C/C++的,其他的语言接口均是在此基础上做的包装,但是本文介绍的技术并不局限于Windows和C++,所有界面库的原理基本都是通用的。

用户界面原理

简单思考下图形用户界面是什么?如下,做过DOS下图形界面的,很容易发现图形用户界面的基本元素就是线框,现代界面也只是在此基础上加上各种阴影、圆角、填充等等,而处理鼠标和界面交互的原理就是判断鼠标和这些线框的位置关系。实际上Window 3.1之前,整个图形界面的底层还是跑在DOS上。

再思考下,电脑屏幕能够显示图像的原理是什么呢?如下,将屏幕做个简化,就类似LED显示屏,每个像素对应一个显示LED,显示对应的图像就是将图像栅格化后按照颜色设置对应像素点像素值,只不过CRT或液晶显示屏的像素密度更高,刷新频率更高而已。

虽然显示原理是栅格化,但是实际显示时我们不可能手动去输入栅格化后的点阵,因此必须有一种方法把图形界面的各种基本元素直线、曲线、圆、椭圆、字体等映射为栅格化点阵,这就是图形学研究的内容,事实上图形界面的发展和图形学发展是离不开的。用户界面的实现包括底层驱动的支持和应用层的支持,一般驱动层支持基本图形元素的绘制,应用层再包装来支持复杂图形绘制。现代操作系统图形绘制常用基本元素基本都已经集成到驱动中,绘制效率非常高,而且针对一些特殊图形绘制做了优化,在游戏等对绘制效率和2D/3D特效要求高的场景,现代显卡都针对OpenGL和DirectX等在驱动层做了优化,Windows更是将图形子系统移到内核模式(如下)。

既然显卡驱动提供了基本元素的显示,那么为了完成用户界面我们需要做的就是调用这些基本元素,绘制图形界面,然后监听用户操作事件作出对应响应即可,这就是操作系统负责做的事情。其实原理就是这么简单,看看最原始windows (如下),实际上也就是这么简单封装。

界面库编程模型

那么界面库的作用是什么?经典Windows中基本功能放在两个模块中——user32.dll和gdi32.dll,前者提供窗口创建和消息传递监听,后者提供直线、曲线、圆等元素绘制功能,这也是现在通用界面库提供的基本功能,在这些功能基础上用户即可构建自己的界面程序,界面库的功能在于提供接口给开发者,开发者按照指定的模式绘制和填充事件响应即可完成界面程序编写。因此常见的编程模型如下:

设计和创建界面:对于系统原生界面库来说,一般是代码创建,一些高级界面库(Qt、WPF等)支持从xml/xaml创建,web前端使用html声明创建。

循环等待和分发事件:这和具体的实现和场景有关系,Win32是基于消息循环,Qt中抽象成了信号槽事件循环,他们都是在主线程中响应事件,而java的awt、前端dom事件等为了安全和界面响应敏捷,将事件分发到了一个单独线程中,用户都是在另外线程中响应事件。

文中相关图片均引用自互联网,如有侵权请留言说明。

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

1.用户界面原理和界面库编程模型相关推荐

  1. aio 系统原理 Java_Java新一代网络编程模型AIO原理及Linux系统AIO介绍

    从JDK 7版本开始,Java新加入的文件和网络io特性称为nio2(new io 2, 因为jdk1.4中已经有过一个nio了),包含了众多性能和功能上的改进,其中最重要的部分,就是对异步io的支持 ...

  2. pyqt5 qstring在哪个库_PyQt模型/视图结构编程示例:QStringListModel的用法

    引言 Python是一种面向对象的高级动态编程语言,相比于其它如C/C++语言,具有上手快.代码少.开发效率高的特点,Qt是跨平台的C++图形用户界面应用程序开发框架,是当前主流的GUI开发工具之一, ...

  3. 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @OData.publish工作原理解析

    Jerry的前一篇文章 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @ObjectModel.readOnly工作原理解析,给大家分享了@ObjectModel.readOnly这个注解对 ...

  4. NVDIMM编程模型原理大概推导梳理

    NVDIMM编程模型原理大概推导梳理2021 1 NVDIMM 简介 NVDIMM(Non-Volatile DIMM) 非易失性DIMM(Dual In-line Memory Module,双列直 ...

  5. AD软件——把原理图库 和 PCB元件库封装模型 关联起来

    S1:原理图库 -> Properties(属性) -> Parameters(参数)  -> Add -> Footprint S2:弹出一个PCB模型对话框,点击 浏览 或 ...

  6. python编辑程序模型_用Python的SimPy库简化复杂的编程模型的介绍

    在我遇到 SimPy 包的其中一位创始人 Klaus Miller 时,从他那里知道了这个包.Miller 博士阅读过几篇提出使用 Python 2.2+ 生成器实现半协同例程和"轻便&qu ...

  7. 看老程序员如何用Python的SimPy库简化复杂的编程模型的

    @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 文章目录 随机的定义 设置商店:对模拟编程 用监控程序监视模拟 三人不欢:一些结果(以及它们意味着什么) 在我遇到 SimPy 包 ...

  8. VS2017下安装fltk库——C++程序设计原理与实践图形编程指南

    VS2017下安装fltk库--C++程序设计原理与实践图形编程指南 前言 最近,我在学习<C++程序设计原理与实践>(原书第一版)遇到了安装图形库的问题,我花了两天时间,通过各种途径查找 ...

  9. 【GPGPU编程模型与架构原理】第二章 2.1 计算模型

      本章介绍以CUDA和OpenCL 并行编程中的一些核心架构概念来展示GPGPU的计算.编程和存储模型.本章还介绍虚拟指令集和机器指令集,逐步揭开GPGPU体系结构的面纱. 2.1 计算模型 计算模 ...

最新文章

  1. 新闻网站项目django--注册页
  2. Linux 下 svn 的使用
  3. static 用法www
  4. java json 转map_Java对接Omni/USDT教程「OmniTool.Java」
  5. 统计字符串中单词个数
  6. JZOJ 2678. 树B
  7. 多线程内存泄漏_内存泄漏的场景和解决办法
  8. cardsui-for-android
  9. 给1-3年的前端 6 点诚心建议
  10. 李开复“口误”惹事,人脸隐私数据合作?蚂蚁、旷视大喊冤枉!
  11. dedecms有缩略图则显示缩略图,没有则显示随机缩略图
  12. python-gui-pyqt5的使用方法-1
  13. 超实用的JavaScript技巧及最佳实践(下)
  14. 读书笔记——《思维的乐趣matrix67数学笔记》
  15. Item25 Use std::move on rvalue reference, std::forward on universal references
  16. C++STL之<set>和<map>
  17. Tableau Desktop连接MongoDB
  18. python runtimewarning_训练神经网络,numpy出现runtime warning的解决思路
  19. 【诺贝尔物理奖量子纠缠】启发:命由我作,福由我求
  20. 小程序加入人脸识别_微信小程序+人脸识别

热门文章

  1. 中国海洋大学计算机博士毕业要求,博士按时毕业不到四成 延长学制促慎重决定...
  2. SUA--Win7的有趣功能
  3. H5游戏性能测试工具 选择与实践总结
  4. 铁轨(Rails) Uva514
  5. 计算机主机无信号输出,电脑屏幕不亮主机还在运行显示无信号(教你解决方法)...
  6. 用argparse实现ls -lha等linux命令格式展示
  7. 基于pyqt编写的高校bbs发帖辅助软件和双色球号码生成器
  8. git与coding远程连接
  9. php获取之前五天的工作日
  10. nodejs MVC框架:Adonisjs框架入门-001概述