[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 ...
随机推荐
- ASP.NET中App_Data等文件夹的作用
文件夹名称 文件类型 注 释 Bin .dll 包含应用程序所需的任何预生成的程序集 App_Browsers .browser 包含应用程序特有的浏览器定义文件,ASP.NET用它来识别各浏览器 ...
- 2019 美柚java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.美柚等公司offer,岗位是Java后端开发,因为发展原因最终选择去了美柚,入职一年时间了,也成为了面试官,之 ...
- Java打印日历表
今天来吐槽一下Java的Calendar类的使用问题,反正我是弄了半天. 首先是,遇到一个问题,输入年份和月份,需要打印这个月的日历,网上有不少代码,但我用了几个感觉都不是很靠谱. 然后经过一番探索, ...
- C# 后台服务器端 Get 请求函数封装
请求参数封装 /// <summary> /// 拼接 Get请求参数 /// </summary> /// <param name="parames" ...
- 85.webpack的安装失败至成功
webpack怎么安装 1.安装node.js; 2.安装webpack: npm install webpack --save-dev : 注意:webpack 4x以上,webpack将命 ...
- consul:架构
官方文档:https://www.consul.io/docs/internals/architecture.html
- Python小练习:批量删除多个文件夹内的相同文件
应用场景: 下载的多个文件夹是压缩包,解压后每个文件夹都有某个网站的推广链接,想要批量的删除该文件 使用环境:win7,python3.6 代码: 1.直接用for循环 由于os.walk()方法自带 ...
- 下载文件时-修改文件名字 Redis在Windows中安装方法 SVN安装和使用(简单版) WinForm-SQL查询避免UI卡死 Asp.Net MVC Https设置
下载文件时-修改文件名字 1后台代码 /// <summary> /// 文件下载2 /// </summary> /// <param name="Fil ...
- MyBatis的一级缓存、二级缓存演示以及讲解,序列化异常的处理
MyBatis的缓存机制 缓存就是内存中的一个空间,通常用来提高查询效率 MyBatis支持两种缓存技术:一级缓存和二级缓存,其中一级缓存默认开启,二级缓存默认关闭 一级缓存 (1)一级缓存默认开启 ...
- ORA-12514: 监听程序当前无法识别连接描述符中请求的服务
/** 异常:ORA-12514: 监听程序当前无法识别连接描述符中请求的服务 * 背景:在很长一段时间都在连接远程开发库,曾偶尔有一次想要连接本地的库进行sql测试,发现连接失败,起初一直有无监听. ...