练习:鼠标类设计之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…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...