[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 ...
随机推荐
- Entity Framework 学习系列(1) - 认识理解Entity Framework
目录 写在前面 什么是Entity Framework EF的优缺点 1.优点 2.缺点 如何理解ORM EF执行的原理 写在前面 在使用.net mvc 开发的时候.为了高效的开发,我们常常会搭配O ...
- dotnet core系列之Background tasks with hosted services (后台任务)
这篇简单讲asp.net core 中的后台任务 用到的包: Microsoft.AspNetCore.App metapackage 或者加入 Microsoft.Extensions.Hostin ...
- Python 迭代器,错误、异常处理
迭代器 迭代器可以用来遍历字符串.列表.元组.集合.字典. myString="hello" myIter=iter(myString) ##iter()函数可以获取元素集的一个迭 ...
- Charles弱网测试转载
一.破解版安装 工具好用是好用,但有个蛋疼的地方,非开源,非开源也就算了,还来个试用30分钟,当时的我就中这招了, 试用了之后发现这工具确实好用,对于测试工程师来说兼抓包定位协议类bug.设置网络阀来 ...
- 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)
[优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...
- Python学习日记(三十七) Mysql数据库篇 五
pymsql的使用 初识pymysql模块 先在数据库中创建一个用户信息表,里面包含用户的ID.用户名.密码 create table userinfo( uid int not null auto_ ...
- PHP的垃圾回收机制之引用计数
1,介绍 php的垃圾回收机制(GC)是在PHP5之后出现的,而在PHP5.3版本之前使用的都是“引用计数”的方式.实现引用计数的实质就是在每个内存对象中都有一个计数器,当内存对象被变量引用时,计数器 ...
- k8s之StatefulSet介绍(六)
复制有状态的Pod replicaSet通过一个pod模版创建多个pod副本.这些副本除了它们的名字和IP地址不同外,没有别的差异.如果pod模版里描述了一个关联到特定持久卷声明的数据卷,那么Repl ...
- Normalize.css重置化样式表
Normalize.css是一种CSS reset的替代方案.它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML ...
- beta冲刺(4/7)
作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:项目beta冲刺(团队) 团队名称: 那周余嘉熊掌将得队 作业目标:beta(4/7) 队员学号 队员姓名 博客地址 备注 221600 ...