和老外的原文好像没多大联系了,哈哈哈,反正是读书笔记,下面的内容也是我读此书中的历程,也写进来吧。不过说实话,这框架的作者还挺对我脾气的,哈哈哈。

拒交“智商税”,解密“GUI”运行之道

我很忙

项目压力大,平时要加班,有些休闲时间,还要学习Qt。。。所以,可以提供的学习成本只剩下2小时了!

有归零的必要吗?

今天的GUI就跟水和空气一样平常,GUI框架数不胜数。其核心工作原理也并非热门技术,我们有学习的必要吗?

往往司空见惯的东西,会被人忽视其重要性;例如人们往往热衷于升级桌面操作系统,请问升级后,最大的直观变化是什么?人们往往关注你使用的GUI框架是Qt还是MFC,请问一个GUI框架的代码量会占你APP代码量的百分之多少?人们往往花大量的时间,学习如何使用各大GUI库的API,请问有多少人去讨论GUI实现的通用原理?

为什么我们使用GUI库,总会出现这样,那样的问题(例如:我的控件咋又不刷新了?我的cpu使用率咋这么高?)而各大主流GUI库升级频繁,越来越多新的GUI框架(例如:flutter)还层出不穷,难道他们没有维护的负担吗?

似乎所有的GUI软件开发商似乎都形成了一种默契,大家对基本技术原理讳莫如深,而在增加GUI体量上面,从不吝惜子弹。

我想,没人知道这是为什么,除非你真正了解GUI的工作原理。。。

2小时的可行性

为了在2小时内完成任务,我们需要选择一个非常小的学习蓝本,本文采用5千行的GuiLite。

GuiLite不同于市面主流的通用UI框架,它们的差异如下:

GuiLite vs 主流UI
比较项 GuiLite 通用UI
代码量 5K+ 1000K+
功能覆盖 UI核心机制+基本UI控件 核心UI机制+丰富的UI控件+所见即所得的UI布局工具
使用方法 根据核心机制自由发挥 寻找适合自己的模板进行加工
学习重点 UI核心机制 熟悉API使用方法
尽管,GuiLite从体量上看非常小,但2小时领会5千行的代码含义,也不现实;但好在可以继续做减法,去掉各种操作系统/显示硬件的适配层,去掉各种UI控件,去掉文字,位图的绘制,就只剩下两个文件了:wnd.cpp(有效代码600行), surface.cpp(有效代码500行)。从代码量上看,差不多可以达成学习目标。

代码阅读策略

没错,GuiLite的核心就是这两个文件,它们的职责如下:

wnd.cpp 负责管理窗口,响应按触摸/鼠标按下/释放消息
surface.cpp 负责绘制基本像素及线条/矩形和图层管理
大家,可以思考一下,你使用的UI框架可能有所不同,但核心要素是不是就是上面两点呢?回到正题,我们只有2小时,如何分配代码阅读时间呢?

我们建议:

使用20~30分钟简单浏览一下surface.cpp,至于如何画点/线/面,初中生都知道,大家check一下功能就好,至于图层管理只有一个函数(set_frame_rect),建议大家略过,放弃研读;因为它需要结合HelloMario这个例子,才便于理解;当然大神可以无视这个建议。

使用30~90分钟详细阅读wnd.cpp,将所有函数的实现看明白。这些函数大部分是赋值操,本身逻辑性不强,遇到这些函数尽快完成浏览,主要精力需要集中在两个函数的理解上:connect,on_touch_down,on_notify;它们功能分别是:

connect 建立一个窗口(该窗口可能含有子窗口系列),初始化所有必要的数据结构
on_touch_down 窗口响应鼠标按下消息,包括:寻找哪个窗口被点中,处理被点中(获得焦点)的窗口,处理上次被点中(失去焦点)的窗口
on_notify 调用用户注册的响应函数,例如:按键响应

总结

当然了解了核心,并不意味着马上就可以灵活运用,它只是在更深的层次帮你解释GuiLite的运行机制,帮助你精确预言UI可能发生的行为。如何有效的运用?还需要参看GuiLiteSamples这些“小而美”的实例代码,由于它们充分挖掘了UI核心,所以代码量往往在100行上下,相信能对大家产生一些启发。

世界上往往没有绝对的捷径,但可能存在一些事半功倍的方法。这是我们的经验,仅供参考,寻找适合自己的模式,放松对2小时的苛求,相信大家都能掌握GuiLite的核心原理(机制);我们相信这些核心原理具有一定的普遍性,无论你是学习Qt,MFC,Winforms,相信都会有所帮助,祝大家学习顺利!
————————————————
原文链接:https://blog.csdn.net/idea4good/article/details/89079290

[golang][gui]Hands On GUI Application Development in Go【在Go中动手进行GUI应用程序开发】读书笔记03-拒交“智商税”,解密“GUI”运行之道的更多相关文章

  1. Mastering Web Application Development with AngularJS 读书笔记-前记

    学习AngularJS的笔记,这个是英文版的,有些地方翻译的很随意,做的笔记不是很详细,用来自勉.觉得写下来要比看能理解的更深入点.有理解不对的地方还请前辈们纠正! 一.关于<Mastering ...

  2. Oracle Fusion Applications (11.1.8) Media Pack and Oracle Application Development Framework 11g (11.1.1.7.2) for Microsoft Windows x64 (64-bit)

    Oracle Fusion Applications (11.1.8) Media Pack for Microsoft Windows x64 (64-bit) 重新搜索   常见问题    提示  ...

  3. Professional Android Application Development

    Professional Android Application Development 访问地址 http://docs.google.com/fileview?id=0ByVHV5sjM4fNNj ...

  4. WEB Application Development Integrator : 应用设置

    1.1.       系统安装 应用 Oracle EBS WEB Application Development Integrator WEB ADI在Oracle EBS 11.5.10.* 版本 ...

  5. 2.GUI控件的使用 --《UNITY 3D 游戏开发》笔记

    1.Label 控件 编写脚本文件,直接绑定在main camera上 public class labelScript : MonoBehaviour { //设定一个值来接收外部赋值的字符串 pu ...

  6. 使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件

    使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件 前期准备: 安装 python:https://www ...

  7. 4: 模块化应用程序开发 Modular Application Development Using Prism Library 5.0 for WPF (英汉对照版)

    A modular application is an application that is divided into a set of loosely coupled functional uni ...

  8. C++ GUI Qt4学习笔记03

    C++ GUI Qt4学习笔记03   qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QM ...

  9. Mastering Web Application Development with AngularJS 读书笔记(三)

    第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...

随机推荐

  1. 使用wcftestclient.exe测试时,增加“最大消息大小配额”--maxReceivedMessa

    使用 WcfTestClient.exe工具测试的时候,可能会出现:这样的提示: 已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的 MaxReceivedMessa ...

  2. 推荐算法之E&E

    一.定义 E&E就是探索(explore)和利用(exploit). Exploit:基于已知最好策略,开发利用已知具有较高回报的item(贪婪.短期回报),对于推荐来讲就是用户已经发现的兴趣 ...

  3. RocketMQ原理及源码解析

    RocketMQ原理深入: 一.定义: RocketMQ是一款分布式.队列模型的消息中间件,有以下部分组成: 1.NameServer: 一个几乎无状态的节点,可集群部署,节点之间无任何信息同步 2. ...

  4. 记一下python的method resolution order(MRO)机制

    一直用python都是拿着cookbook和库的文档直接撸,很少会把细节过得那么彻底,遇到问题才会翻文档. 今天看到这个例子的时候我突然触及了我的盲区,我不确定这样的继承层级调用super.foo() ...

  5. pycharm 里运行 django 工程 You must either define the environment variable DJANGO_SETTINGS_MODULE 错误

    pycharm 里运行 django 工程出现错误(在命令行直接运行ok): django.core.exceptions.ImproperlyConfigured: Requested settin ...

  6. pandas 之 数据合并

    import numpy as np import pandas as pd Data contained in pandas objects can be combined together in ...

  7. Ubuntu 18.04 + Gtx 1660 安装Nvidia 显卡驱动

    1.UEFI禁用secure boot(我的系统是win10主系统,引导ubuntu,安装驱动前电脑存在win10 uefi引导问题) Make sure the "OS Type" ...

  8. Windows & Ubuntu 双系统完美卸载Ubuntu(不残留,无污染)

    双系统卸载Ubuntu时,如若直接从Windows磁盘管理里格式化Ubuntu分区,由于Ubuntu的引导盘的原因,会导致电脑启动时出现问题,所以不建议这样的操作. 卸载Ubuntu前需要区分BIOS ...

  9. linux定时任务crontab怎样执行root命令

    在/var/spool/cron/文件夹下放置了所有定时任务文件, 1.运行crontab -u $用户名 -e会显示$用户的所有定时任务: 2.运行sudo crontab -e会显示root用户所 ...

  10. jenkins忘记admin密码的处理方法

    如果忘记admin的登录密码,可按如下方法处理 # 编辑config.xml文件,替换passwordHash行的内容# vim /var/lib/jenkins/users/admin_167938 ...