Page246~250 11.1GUI下的I/O基础

news2024/11/15 15:34:46

11.1.1  从“控制台”说起

“命令行交互界面”(简称CUI,也有人称为CLI)。

CUI需要我们记忆并在控制台输入命令文本内容,而GUI则以图形的方式呈现、组织各类命令,比如Windows的“开始”菜单,用户只需通过简单的键盘或鼠标操作,就可以发起命令。

GUI操作系统重,用户可以同时处理多个任务,然而,一个总喜欢等待你“按下任意键”的CUI屏幕,就是史前操作系统展现各用户的全部,难以实现多任务

CUI和GUI的形同之处

我们写过的许多与用户交互的代码,其过程基本类似于图11-1

                                        图11 -1 典型的CUI主循环

11.1.2    GUI下的输入处理

基于控制台的程序,输入用cin, 输出用cout,非常简单。

GUI的输入,并非通过一个函数直接读取用户的一个按键操作或鼠标动作(也包括触摸屏的输入)的结果,而是操作系统,帮我们捕获这些输入操作,然后再有它转发到程序。

在GUI的世界里,往往有多个程序同时运行,哪怕就只有一个程序在运行,屏幕也可能有多个“图形元素”等待用户输入,所以必须有一套机制,以方便操作系统将用户的输入准确地转发到特定的那个图形元素。

这套机制最基础的要求是:每个图元元素都有一个“编号”(可以理解为“地址”)。综上所述,输入过程如图11-2所示

                                                        图11-2  消息传递与分发

统一术语:

以Windows操作系统为例,操作系统发送给各个应用程序的信息(包括用户输入),称为“消息(Message/Msg)”;各个拥有标号的“图形元素”,称为“窗口(Windows/Wnd)”;而编号也不是普通编号,它叫“句柄(Handle)

句柄的含义:句柄就是每个窗口在操作系统中唯一的编号。

控制台程序中,当程序运行到“cin >> i”之类的语句时,程序就卡在那里等待用户输入了。

但在GUI环境下,一个带窗口的程序运行起来之后,用户抓过鼠标就在窗口上挪动,并乱点一气……,这些操作都被认为是合理的,于是就将这些消息一次发送给程序了;如果程序不处理这些消息(哪怕是收到后就直接丢弃),操作系统就会会怀疑这个程序挂掉了。

所以编写一个GUI应用,最重要的事情,就是抓紧搞一个“死循环”来接收这些消息。以Windows操作系统为例,这个“死循环”的C代码类似:

//Windows API编程示例的伪代码
MSG msg; //消息
while(::GetMessage(&msg)
{
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
}

三个全局函数,都是Windows操作系统提供的编程接口(API)函数。

GetMessage源源不断地获取属于当前进程的消息

然后通过TranslateMessage做必要的转换

再调用DispatchMessage将它们正确地分派给本进程内的窗口。

但,代码里没有看到窗口句柄,怎么知道各个消息属于哪个窗口呢?猜一下就知道了,MSG结构里有一个成员,就是这个消息所属窗口的句柄

再往后的工作,就是每个窗口都会有一个术语为"WndProc(窗口过程)"的函数,它会收到操作系统发来的消息,然后搞一个“switch / case”结构来区分消息是什么,再做处理。

                                                图  11-3    GUI下的消息循环

这个过程被称为消息循环。简单地理解,就是应用程序将源源不断地接收到消息,然后判断这消息是什么,根据这个消息触发并执行一段事件(回调函数),然后再收到新消息……

一个从零开始的GUI应用代码,需要从“GetMessage(...)”开始写起,但多数C++  GUI库,都将这个过程封装起来,所以编程重心变成是为每一类窗口(如图11-3中的窗口1和窗口2)写它处理消息的过程;但一大块的"switch / case"是令人厌烦的结构,所以GUI库提供了一些手段,帮助我们绕过"switch / case"。

11.1.3    GUI下的输出处理

既然叫“图形用户界面”,自然要在屏幕上画各种信息。屏幕再大,面积总是有限的,外加“多任务”,每个进程都抢这在屏幕上涂鸦,结果很容易想到:后面画的内容,会将前面的内容覆盖掉。

电脑上打开QQ登录框,把它摆在屏幕中央;然后打开浏览器,拖过去盖住QQ登录框,此时,我们看到的那个QQ登录框还在吗?

那个QQ登录框真的不在了。QQ程序肯定还在内存里,QQ登录框的窗口句柄也还在操作系统的“账本”里,但此时操作系统无需尝试网屏幕上“画”那个对话框;

假设我们将浏览器一点一点地挪开,此时QQ程序会收到一个消息:“你快重画窗口,不过就这一小块有效。

如此,是否可以推出GUI程序和CUI程序在界面显示上最大的不同?

CUI程序是主动的,在你想要的时间,地点,想说一句话是,直接cout一下,比如:

char C;

//此时,此处,需要一句提示
cout << "请输入一个字母:";
cin >> C;

//此时,此处,又需要一句话
cout << "您输入的字母是:" << C << "。" << endl;
//想想,觉得需要再补一句
cout << "我是不是很聪明?" << endl;

GUI程序在这方面却是被动的,它必须等操作系统发消息通知它:“嘿,你可以在屏幕上输出点什么了。”  操作系统通知一次,就得响应一次。

假设GUI程序使用DrawText(int x, int y, char const* text)函数可以在屏幕上指定位置上输出一句话,但程序只是主动调用一次,比如:

DrawText(100, 100, "Hello World");

屏幕上确实有可能出现那句话,但此时再把浏览器拖过啦,“盖住”那行话,然后移开……那行话消失不见了,浏览器就像一个橡皮擦,把那行话擦掉了

其间原因在于:我们写的程序也接收到了操作系统“快重画吧”的消息,却不理会这个消息,没有再次调用DrawText()操作。

那么,是不是屏幕上显示的所有内容,都需要我们写代码自行绘画呢?当然不是,像常规窗口,对话框,按钮,列表框和菜单等标准袁术,它们在不同的应用中长得样子都相似,可见其画法都一样。因为它们统一由操作系统(或其GUI支持库)负责在屏幕上画出来,除非我们想搞定制,比如画一个不规则多边形的按钮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1439966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】C++的简要介绍

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 什么是C2. C的发展史3. C的重要性3.1 语言的使用广泛度3.2 在工作领域3.3 在校招领域3.3.1 岗位需求3.3.2 笔试题 3.3.3 面试题 4. 如何学习C4.1 别人怎么学&#xff1f; 1. 什么是C C语言是结构化和模块化的语言&…

写后台接口,前后台数据对接(vue+springboot)

一、怎么写接口&#xff1f;&#xff1f;&#xff1f; 1.Entity&#xff08;定义一堆属性之类的&#xff09; altins>getter和setter方法 2.Controller 3.Service&#xff08;查询出数据&#xff09; 调用了一个方法 4.Mapper 5.回到service&#xff08;返回数据&#x…

关于 Ant Design 的 Upload 组件使用 action 自动上传出现跨域问题的解决

问题描述 使用 Ant Design 的 Upload 组件时&#xff0c;可以通过 action 属性指定上传地址实现选择文件自动上传。但在我选择文件上传后浏览器控制台一直出现跨域错误。关键我已经在后端处理了跨域&#xff0c;还是一直会出现跨域错误。而且其它请求都可以正常处理跨域&#…

机器学习——有监督学习和无监督学习

有监督学习 简单来说&#xff0c;就是人教会计算机学会做一件事。 给算法一个数据集&#xff0c;其中数据集中包含了正确答案&#xff0c;根据这个数据集&#xff0c;可以对额外的数据希望得到一个正确判断&#xff08;详见下面的例子&#xff09; 回归问题 例如现在有一个…

文生图提示词:摄影艺术风格

艺术风格 --摄影艺术风格 Photography Art Styles 覆盖了从传统到现代、从具象到抽象的多种摄影艺术风格&#xff0c;展示了摄影作为一种艺术形式的广泛性和多样性。 Portrait Photography 人像摄影 Landscape Photography 风景摄影 Street Photography 街头摄影 Documentary P…

质数基础筛法

文章目录 埃氏筛线性筛 埃氏筛 埃氏筛是一种筛素数的方法&#xff0c;埃氏筛的思想很重要&#xff0c;主要是时间复杂度 朴素的埃氏筛的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn) 这个复杂度是调和级数 vector<int>p; int vis[N];void solve() {rep(i,2,n){if(…

Java学习网络编程

Java学习网络编程 大纲 网络相关概念IP地址网络协议InetAdressSocket 具体案例 1. 网络相关概念 网络 网络通信 2. IP地址 域名 3.网络协议 4. InetAdress 获得本机的名字和IP public static void main(String[] args) throws UnknownHostException {InetAddress inetA…

C语言——T/单链表专题

1. 链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 链表的结构跟⽕⻋⻋厢相似&#xff0c;淡季时⻋次的⻋厢会相应减少&#xff0c;旺季时⻋次的⻋厢会额外增加⼏节。只…

【flink状态管理(三)】StateBackend的整体设计、StateBackend创建说明

文章目录 一. 状态后端概述二. StateBackend的整体设计1. 核心功能2. StateBackend的UML3. 小结 三. StateBackend的加载与初始化1. StateBackend创建概述2. StateBackend创建过程 一. 状态后端概述 StateBackend作为状态存储后端&#xff0c;提供了创建和获取KeyedStateBacke…

数据结构:双向链表

文章目录 1. 双向带头循环链表的结构2. 相关操作2.1 创建节点2.2 尾插2.3 头插2.4 打印2.5 尾删2.6 头删2.7 查找2.8 指定位置前/后插入2.9 删除指定位置的节点2.10 删除指定位置后的节点2.11 销毁链表 3.顺序表与链表区别 1. 双向带头循环链表的结构 与单链表不同的是&#xf…

Python学习从0到1 day14 Python数据容器.5.总结及通用操作

我什么都没有忘&#xff0c;只是有些事只适合收藏&#xff0c;不能说&#xff0c;不能想&#xff0c;却也不能忘 ——24.2.4 一、数据容器的分类 数据容器可以从以下视角进行简单的分类 1.是否支持下标索引&#xff1a; 支持&#xff1a;列表元组、字符串——序列类型 不支持&a…

华为机考入门python3--(9)牛客9-提取不重复的整数

分类&#xff1a;列表 知识点&#xff1a; 从右往左遍历每一个字符 my_str[::-1] 题目来自【牛客】 def reverse_unique(n): # 将输入的整数转换为字符串&#xff0c;这样可以从右向左遍历每一位 str_n str(n) # 创建一个空列表来保存不重复的数字 unique_digits []…

从零开始手写mmo游戏从框架到爆炸(十一)— 注册与登录

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 从这一章开始&#xff0c;我们进入业务的部分&#xff0c;从注册登录开始。 创建注册和登录的路由 package com.loveprogrammer.command.server;public interface Se…

使用easyExcel 定义表头 字体 格式 颜色等,定义表内容,合计

HeadStyle 表头样式注解 HeadFontStyle 表头字体样式 HeadStyle(fillPatternType FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor 22) HeadFontStyle(fontHeightInPoints 12) 以下为实现效果

《图像处理》 图像细化

前言 图像细化算法又称之为Thinning Algorithms&#xff0c;或者骨架提取&#xff08;skeleton&#xff09;。该算法通常用于手写体数字的细化&#xff0c;输入的图像要求是黑白图像&#xff0c;即二值图像。从白色区域提取出该区域的中心线&#xff0c;中心线对于白色区域相当…

OpenMLDB 作为中国唯一的特征平台产品入选 2023 Gartner 研究报告

在国际权威咨询与研究机构 Gartner 发布的重要研究报告《The Logical Feature Store: Data Management for Machine Learning》(《逻辑特征存储&#xff1a;机器学习的数据管理》&#xff0c;下文简称报告&#xff09;中&#xff0c;OpenMLDB 荣幸作为中国唯一的特征平台代表产…

vite项目配置根据不同的打包环境使用不同的请求路径VITE_BASE_URL,包括报错解决

vite环境配置可以看官方文档&#xff1a;环境变量和模式 | Vite 官方中文文档 创建环境配置文件 在项目根目录下面创建.env和.env.production文件&#xff0c;.env是开发环境使用的&#xff0c;.env.production是生产环境使用的。 .env文件&#xff1a; # 基本环境 VITE_APP…

PyTorch 2.2 中文官方教程(一)

PyTorch 秘籍 PyTorch 秘籍 原文&#xff1a;pytorch.org/tutorials/recipes/recipes_index.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 秘籍是关于如何使用特定 PyTorch 功能的简短、可操作的示例&#xff0c;与我们的全长教程不同。 PyTorch 原型示例 原文…

7机器人位姿的数学描述与坐标变

由上次刚体的空间转动直接切换为机器人相关术语。 1.机器人位姿的数学描述与坐标变换 1.1位姿描述 {B}相对于{A}的姿态描述用3x3矩阵表示为&#xff1a; 式中为三个单位正交主矢量&#xff0c;分别表示刚体坐标系{B}的三个坐标轴XBYBZB在参考系{A}中的方位&#xff0c;∠XBXA表…

单片机——FLASH(2)

文章目录 flash &#xff08;stm32f40x 41x的内存映射中区域详解&#xff09;flash写数据时 flash &#xff08;stm32f40x 41x的内存映射中区域详解&#xff09; Main memory 主存储区 放置代码和常数 System memory 系统存储区 方式bootloader代码 OTP区 一次性可编程区 选项…