练习:鼠标类设计之1_类内容解析
前言
光做理论上的总结,不做练习理解不会那么深刻
做类的练习,解析类里面的内容有哪些
引入
电脑使用最频繁的两个外设:鼠标和键盘,他们每时每刻都在和用户交互,试做一个鼠标类
思路
我们现在要做一个鼠标类,这个类是属于能动类还是资源类呢?鼠标似乎自己做不了什么,需要和其他对象交互才能产生效果,在有的书上也被称作"事件类".他们的使用大概是这个样子的:
class SomeType{ //某个类private:........public:RtnType fun(Mouse mouse); //成员方法,鼠标对象作为参数传入
}
鼠标的物理层面
我们手里使用的鼠标实际上是一个传感器. 他发出了一些信号,比如左键单击,右键单击,左键双击,中键点击,中键上滚(下滚),还有一些鼠标包含左右侧键等等.应该有对应的地址空间去采集这些数据.所以:在鼠标类设计前,应设计一个同步信息类.
同步信息类的设计
用途:接收鼠标传来的信号.---标准的资源类.
说明:笔者并不知道硬件驱动是怎么描述鼠标信息的.做以下假设:
有5个信号,分别是鼠标左键点击,右键点击,鼠标滚轮滚动,鼠标平移和鼠标升降,他们都是用int存储的.找到他们在内存中的位置,例如0x00,0x04,0x08,0x0c,0x10,定义地址映射
int *lc=(int *)0x00;
int leftClick=*lc; //映射鼠标左键
int *rc=(int *)0x04;
int rightClick=*rc; //映射鼠标右键
int *ro=(int *)0x08;
int roll=*ro; //映射鼠标滚轮
int *m=(int *)0x0c;
int Move=*m; //映射鼠标平移
int *r=(int *)0x10;
int Rise=*r; //映射鼠标升降
再次声明,因为不知道具体形式,假设部分数据类型所以可能有错---比如左键点击可能只占了1位,而鼠标移动可能是long类型. 还有指针本来不能指向具体内存地址,但关于硬件的部分必须这样做.这里的地址也是假设的,应该由操作系统给出.---------这部分有知道朋友的可以留言讨论
现在可以创建同步信息类了.
class MouseInfo{private:int left_click;int right_click;int roll;int move;int rise;public:MouseInfo(int lc,int rc,int ro,int lm,int rm);
}
此外,我们还想获取到类属性的状态,例如:中键一定时间内无滚动,一定时间内无左移(右移),视为冻结状态freeze, 添加这部分内容到同步信息类里.
class MouseInfo{private:int left_click; //左键单击int right_click; //右键单击int roll; //中键滚动bool freeze_roll;int move; //鼠标平移bool freeze_move;int rise; //鼠标升降bool freeze_rise;bool freeze_all; //全部冻结状态public:MouseInfo(int lc,int rc,int ro,int lm,int rm); //构造函数void freezeJudge(); //冻结状态判断
}
两个函数实现:
MouseInfo::MouseInfo(int lc,int rc,int ro,int lm,int rm):left_click(lc),right_click(rc),roll(ro),move(lm),rise(rm) //构造函数{freeze_roll=true;freeze_move=true;freeze_rise=true;freeze_all=true;} void MouseInfo::freezeJudge() //冻结状态判断{int rollTemp=roll; //存储当前roll值;int mTemp=move; //存储当前平移值;int rTemp=rise; //存储当前升降值;sleep(50); //延时50毫秒freeze_roll=(roll==rollTemp)?true:false; //滚动判定freeze_move=(mTemp==move)?true:false; //平移判定freeze_rise=(rTemp==rise)?true:false; //升降判定if(left_click!=1&&right_click!=1&&freeze_roll&&freeze_move&&freeze_rise)freeze_all=true; //鼠标没输出elsefreeze_all=false; }
说明: 定义了几个状态判定变量是否状态发生变化
类的内容
类的内容有属性和方法,属性表示对象由什么组成,以及处于某种状态.
属性是对于对象组成部分和对象状态的描述.
属性和对象的关系如下:
1>对象被看成一个个体,属性表示个体的组成部分
举例:有一个抽奖箱,里面装了一些矩形纸片.那么抽奖箱的类里有两个对象:抽奖箱盒子和纸片集合---容器类对象,容器里是纸片.
2>对象属性可以描述对象.
举例:纸片对象可以用顶点坐标和长度宽度来描述,所以纸片类属性包括坐标和长度,宽度.具体描述可以用构造方法来说明. 但设计属性时可以先不关注,只需要知道对象和属性必然相关就可以.
3>对象属性可以描述对象状态
对象个体必然处于某几种状态之一时,可以把状态设置在属性里,并随时查询.
举例:鼠标必然处于下列状态之一:左键单击,右键单击,滚轮滚动,鼠标左右移动,鼠标上下移动,冻结状态。下面的鼠标类设计中,鼠标状态是属性内容之一。
鼠标类设计之1:鼠标状态
考虑到多个状态,使用枚举来描述。具体原因可查看“白话编程--数据篇(4)枚举”
枚举在c++中作为静态数据,先于对象存在。
定义一个属性,类型为枚举型。
定义一个方法,可以获取到枚举值
class Mouse{public:/*下列状态表示左击,右击,双击,拖拽,卷动,鼠标平移,升降,冻结*/enum State{LCLICK,RCLICK,DCLICK,DRAG,ROLL,MOVE,RISE,FREEZE};private:State state;public:Mouse();State getState(MouseInfo mi); //传入鼠标信息类对象,获取状态
}
说明:由于尚未完善程序,所以构造方法可以忽略
*******************************以下内容已废弃*************************************************************
实现状态查询方法getState
State getState(MouseInfo mi){if(mi.left_click==1){mi.left_click==0; //人为将该值置0sleep(500);if(mi.left_click==1)return DCLICK;elsereturn LCLICK; //左键单击或双击判定if(mi.right_click==1)return RCLICK;mi.freezeJudge();if(!mi.freeze_roll)return ROLL;if(!mi.freeze_move)return MOVE;if(!mi.freeze_rise)return RISE;if(!mi.freeze_all)return FREEZE;
}
说明:其间顺序不是绝对的,优先级可以自己定义。
细心的朋友可能还会发现问题:没有定义长按鼠标,以及长按后拖拽。---这部分需要硬件支持,笔者设定中按下后一个映射的寄存器为1,抱歉!
*******************************以上内容已废弃*************************************************************
=========================2024.2.12update===================================
实现状态查询方法getState
说明:增加了拖拽判定。
------------程序有时候不是一蹴而就的。初贴于2月9日(年三十),开始没想到解决办法,2月12日(初三)作了补充。原来的痕迹留下来,作为记录
State getState(MouseInfo mi){if(mi.left_click==1){mi.left_click==0; //人为置0sleep(500); //延时0.5秒if(mi.left_click==1) //采集信息,如果双击或长按将采集到1mi.left_click==0; //再次人为置0if(mi.left_click==0) //如果采集到0 return DCLICK; //双击状态确定else //如果采集到1,作为长按确定,长按不作为单独状态mi.freezeJudge(); //冻结判定if(!mi.freeze_move||!mi.freeze_rise) return DRAG; //拖拽确定 elsereturn LCLICK; //单击确定}if(mi.right_click==1)return RCLICK; //右键单击确定mi.freezeJudge();if(!mi.freeze_roll)return ROLL; //中键卷动确定if(!mi.freeze_move)return MOVE; //鼠标左右移动确定if(!mi.freeze_rise)return RISE; //鼠标升降移动确定if(!mi.freeze_all)return FREEZE; //鼠标处于冻结状态确定
}
说明:其间顺序不是绝对的,优先级可以自己定义。
再次声明:代码非可直接使用主要是思路!
未完待续。。。
相关文章:
练习:鼠标类设计之1_类内容解析
前言 光做理论上的总结,不做练习理解不会那么深刻 做类的练习,解析类里面的内容有哪些 引入 电脑使用最频繁的两个外设:鼠标和键盘,他们每时每刻都在和用户交互,试做一个鼠标类 思路 我们现在要做一个鼠标类,这个类是属于能动类还是资源类呢?鼠标似乎自己做不了什么,需要和其…...
消息队列RabbitMQ-使用过程中面临的问题与解决思路
消息队列在使用过程中会出现很多问题 首先就是消息的可靠性,也就是消息从发送到消费者接收,消息在这中间过程中可能会丢失 生产者到交换机的过程、交换机到队列的过程、消息队列中、消费者接收消息的过程中,这些过程中消息都可能会丢失。 …...
搜索Agent方案
为啥需要整体方案,直接调用搜索接口取Top1返回不成嘛?要是果真如此Simple&Naive,New Bing岂不是很容易复刻->.-> 我们先来看个例子,前一阵火爆全网的常温超导技术,如果想回答LK99哪些板块会涨,你…...
排序算法---计数排序
原创不易,转载请注明出处。欢迎点赞收藏~ 计数排序(Counting Sort)是一种线性时间复杂度的排序算法,其核心思想是通过统计待排序元素的个数来确定元素的相对位置,从而实现排序。 具体的计数排序算法步骤如下ÿ…...
STM32——LCD(1)认识
目录 一、初识LCD 1. LCD介绍 2. 显示器的分类 3. 像素 4. LED和OLED显示器 5. 显示器的基本参数 (1)像素 (2)分辨率 (3)色彩深度 (4)显示器尺寸 (5ÿ…...
iTop-4412 裸机程序(二十二)- RTC时钟
目录 0.源码1. RTC2. iTop4412 中的 RTC使用的相关寄存器3. BCD编码4. 关键源码 0.源码 GitHub:https://github.com/Kilento/4412NoOS 1. RTC RTC是实时时钟(Real Time Clock)的缩写,是一种用于计算机系统的硬件设备࿰…...
Kafka 之 AdminClient API
目录 一. 前言 二. KafkaAdminClient API 2.1. API 总览 2.2. Topic 操作 2.2.1. 创建 Topic 2.2.2. Topic 列表 2.2.3. 删除 Topic 2.2.4. 描述 Topic 详细信息 2.3. 分区 Partition 操作 2.3.1. 增加分区 2.3.2. 分区副本重新分配 2.3.3. 查询分区副本列表 2.4.…...
Flutter run 一直 Running Gradle task ‘assembleDebug’…
发生缘由 Flutter 项目引入 fluttertoast 插件后,执行 Flutter run 一直 Running Gradle task ‘assembleDebug’…,最后发现下载 kotlin-compiler-embeddable-7.1.0.jar 特别的缓慢。 运行环境 电脑系统版本:Windows 10 64bit VS Code&…...
kali无线渗透之用wps加密模式破解出wpa模式的密码12
WPS(Wi-Fi Protected Setup,Wi-Fi保护设置)是由Wi-Fi联盟推出的全新Wi-Fi安全防护设定标准。该标准推出的主要原因是为了解决长久以来无线网络加密认证设定的步骤过于繁杂之弊病,使用者往往会因为步骤太过麻烦,以致干脆不做任何加密安全设定&…...
【Python】高级数据类型
🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…...
挑战杯 python区块链实现 - proof of work工作量证明共识算法
文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…...
如何给最小化安装的CentOS主机装个远程桌面?
正文共:888 字 18 图,预估阅读时间:1 分钟 前面我们领微软云Azure的免费主机时(白嫖党618福利!来Azure领200美刀!外加云主机免费用一年!),发现“有资格免费试用服务”的主…...
知识图谱:py2neo将csv文件导入neo4j
文章目录 安装py2neo创建节点-连线关系图导入csv文件删除重复节点并连接边 安装py2neo 安装python中的neo4j操作库:pip install py2neo 安装py2neo后我们可以使用其中的函数对neo4j进行操作。 图数据库Neo4j中最重要的就是结点和边(关系)&a…...
备战蓝桥杯---图论之最短路Bellman-Ford算法及优化
目录 上次我们讲到复杂度为(nm)logm(m为边,n为点)的迪杰斯特拉算法,其中有一个明显的不足就是它无法解决包含负权边的图。 于是我们引进Bellman-Ford算法。 核心:枚举所有的点,能松弛就松弛,直…...
C++ //练习 5.19 编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。
C Primer(第5版) 练习 5.19 练习 5.19 编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。 环境:Linux Ubuntu(云服务器&#x…...
算法刷题:有效三角形个数
有效三角形个数 .题目链接题目详情算法原理补充知识点双指针:对撞指针 我的答案 . 题目链接 有效三角形个数 题目详情 算法原理 补充知识点 有效三角形需要满足的条件: ab>cac>bbc>a 其实在满足1的时候,c是最大的,那么2和3是显然成立的,因此我们可以这样解题: 对…...
python---变量
1.变量就是存储数据的空间,在内存上; 2.变量命名规则:(1)由数字,字母,下划线组成,数字不能开头; (2)不能和关键字冲突; (…...
数据库第二次实验
目录 1 实验内容 2 SQL代码及运行截图 2.1 创建表并插入数据 2.1.1 创建表 2.1.2 插入数据 2.1.3 运行截图 2.2 修改表 2.2.1 SQL代码 2.2.2 运行截图 2.3 删除操作 2.3.1 SQL代码 2.3.2 运行截图 2.4 数据库的备份 2.5 数据库的恢复 1 实验内容 实验目的&#…...
容器高级知识:Kubernetes Pod 适配器模式详解
Kubernetes Pod 适配器(Adapter)模式详解 Kubernetes Pod 适配器模式是侧车(Sidecar)模式的一个特例,其中使用专用的 适配器容器 在主应用程序容器和其他服务或客户端之间 翻译 数据或信号。它充当桥梁,调整通信格式或协议以实现…...
云原生容器化-5 Docker常见操作命令
1.登录和退出docker仓库 使用docker login和docker logout分别用于登录和退出docker仓库。 #登录时携带用户名、密码、仓库地址信息 docker login --username test --password test123 192.168.0.22:8000 docker login --username seong --password 3er4#ER$ 192.168.0.22:8…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
