[golang][gui]Hands On GUI Application Development in Go【在Go中动手进行GUI应用程序开发】读书笔记03-拒交“智商税”,解密“GUI”运行之道
和老外的原文好像没多大联系了,哈哈哈,反正是读书笔记,下面的内容也是我读此书中的历程,也写进来吧。不过说实话,这框架的作者还挺对我脾气的,哈哈哈。
拒交“智商税”,解密“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”运行之道的更多相关文章
- Mastering Web Application Development with AngularJS 读书笔记-前记
学习AngularJS的笔记,这个是英文版的,有些地方翻译的很随意,做的笔记不是很详细,用来自勉.觉得写下来要比看能理解的更深入点.有理解不对的地方还请前辈们纠正! 一.关于<Mastering ...
- 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) 重新搜索 常见问题 提示 ...
- Professional Android Application Development
Professional Android Application Development 访问地址 http://docs.google.com/fileview?id=0ByVHV5sjM4fNNj ...
- WEB Application Development Integrator : 应用设置
1.1. 系统安装 应用 Oracle EBS WEB Application Development Integrator WEB ADI在Oracle EBS 11.5.10.* 版本 ...
- 2.GUI控件的使用 --《UNITY 3D 游戏开发》笔记
1.Label 控件 编写脚本文件,直接绑定在main camera上 public class labelScript : MonoBehaviour { //设定一个值来接收外部赋值的字符串 pu ...
- 使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件
使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件 前期准备: 安装 python:https://www ...
- 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 ...
- C++ GUI Qt4学习笔记03
C++ GUI Qt4学习笔记03 qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QM ...
- Mastering Web Application Development with AngularJS 读书笔记(三)
第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...
随机推荐
- 一款比较强大的jquery表格插件Datatables
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 链接:http://www.datatables.club/ 本人无聊时发现的一款用 ...
- Java Mockito 笔记
Mockito 1 Overview 2 Maven 项目初始化 3 示例 3.1 第一个示例 3.2 自动 Mock 3.3 Mock 返回值 3.4 Mock 参数 3.5 自动注入 Mock 对 ...
- Mysql关键字Explain 性能优化神器
Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句或是结构的性能瓶颈.在select语句之前增加explaion关键字,MySQL会在查询上设置一个标记,执行查 ...
- Matlab享元模式
享元模式(Flyweight)通过共享技术实现相同或相似对象的重用,可以减少创建对象的数量,以减少内存占用和提高性能.Java String的常量池,python logging,线程池,数据库连接池 ...
- 从 html 元素继承 box-sizing
在大多数情况下我们在设置元素的 border 和 padding 并不希望改变元素的 width,height值,这个时候我们就可以为该元素设置 box-sizing:border-box;. 我不希 ...
- 18、git提交代码并将develop分支合并到master分支上
提交合并代码流程: git add .git commit -m ''git pushgit checkout mastergit merge develop //将develop 分支与master ...
- JS this指向总结
使用 JavaScript 开发的时候,很多开发者多多少少会被 this 的指向搞蒙圈,但是实际上,关于 this 的指向,记住最核心的一句话:哪个对象调用函数,函数里面的this指向哪个对象. 下面 ...
- Es查询工具使用
Kibana按照索引过滤数据 1.创建索引模式 2.查询索引中的数据 Es查询不返回数据 创建索引的时候指定mapping mappings={ "mappings": { &qu ...
- pycharm 里运行 django 工程 You must either define the environment variable DJANGO_SETTINGS_MODULE 错误
pycharm 里运行 django 工程出现错误(在命令行直接运行ok): django.core.exceptions.ImproperlyConfigured: Requested settin ...
- 虚拟机安装xp系统教程
xp和win7安装过程有区别 xp.iso和win7.iso不一样 安装xp必须用特殊方法,此方法的大致步骤如下: 1.VMware新建xp类型的虚拟机 2.进入xp的PE系统 3.在PE系统分2个区 ...