练习:鼠标类设计之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…...
2026年电钢琴避坑指南|高性价比品牌型号推荐,新手必看!
电钢琴选购核心要点(快速避坑) 在推荐具体机型前,先明确4个选购关键指标,确保不踩坑: 1.键盘:必须88键逐级配重重锤键盘,避免毁手型。 2.复音数:至少128复音(避免弹奏复杂曲目时丢…...
DwarfStar 4:Redis 之父打造 DeepSeek V4 Flash 本地推理引擎,MacBook 上跑出 26 tok/s
DwarfStar 4:Redis 之父打造 DeepSeek V4 Flash 本地推理引擎,MacBook 上跑出 26 tok/s 一、背景:本地运行 284B 大模型成为现实 2026 年 5 月,一个开源项目在 GitHub 上迅速获得 10k 星标——DwarfStar 4 (ds4),由 …...
别再硬刚滑块了!一个Python脚本自动搞定淘宝X5SEC验证码
Python自动化破解淘宝X5SEC滑块验证码实战指南 淘宝作为国内最大的电商平台之一,其反爬机制一直处于行业领先水平。其中X5SEC滑块验证码是淘宝用来识别自动化程序的主要手段之一。对于需要批量采集商品数据或进行价格监控的开发者来说,频繁的手动滑块验证…...
垃圾分类助手APP - 安卓期末大作业
垃圾分类助手APP - 安卓期末大作业 【下载地址】垃圾分类助手APP-安卓期末大作业 本项目是一个基于Android Studio的安卓应用程序,专为满足垃圾分类指导需求设计。作为一款学习与实践相结合的期末大作业,它不仅集成了丰富的前端和后端功能,还…...
用STM32F103C8T6做个触摸感应示波器?手把手教你ADC采集+OLED波形显示(附完整代码)
用STM32F103C8T6打造触摸感应示波器:从ADC采集到OLED波形显示的趣味实践 在嵌入式开发领域,将枯燥的技术参数转化为可视化的交互体验,往往能激发学习者的深层兴趣。今天我们要实现的,不仅是一个简单的信号采集系统,而是…...
独立开发者如何借助Taotoken多模型能力优化个人项目成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken多模型能力优化个人项目成本 对于独立开发者和小型项目而言,在探索大模型应用时࿰…...
Cadence SPB17.4导入外部封装后,原理图封装属性不更新?一个属性编辑框解决你的困扰
Cadence SPB17.4原理图封装属性更新难题:从数据库到设计的完整解决方案 当你花费数小时将力创封装库成功导入Cadence PCB Editor后,满心欢喜地打开原理图进行DRC检查,却发现那些熟悉的"PCB Footprint Not Found"错误依然存在——这…...
【亲测免费】 TSK UF系列Prober操作手册下载
TSK UF系列Prober操作手册下载 【下载地址】TSKUF系列Prober操作手册下载 本仓库提供TSK UF系列Prober的操作手册下载,具体为UF190/UF200系列的manual。TSK UF系列Prober是半导体厂针测的重要设备,该手册详细介绍了设备的各项功能、操作步骤以及维护保养…...
Keil µVision多目标配置与条件编译实战指南
1. 项目概述 在嵌入式开发中,我们经常会遇到一个实际需求:如何基于同一套源代码生成多个不同的程序版本?这个问题看似简单,但在Keil Vision这样的集成开发环境中,却涉及到项目管理、编译配置和条件编译等多个技术要点。…...
5步掌握VideoDownloadHelper:让网页视频下载变得简单高效
5步掌握VideoDownloadHelper:让网页视频下载变得简单高效 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经遇到过这样的…...
