当前位置: 首页 > news >正文

练习:鼠标类设计之2_类和接口

前言

        续鼠标类设计之1,前面解决了鼠标信号问题,这里解决显示问题

引入

        鼠标伴随操作系统而生,考虑在屏幕上怎样显示

思路

        1>鼠标显示是一个动态效果,所以需要一个“动态效果类”对象,添加进鼠标类的属性里。

        在面向对象的程序中,对象模拟的个体可以有动作---漆匠;对象模拟的动作也可以是对象。所以有了Painter类和Paint类。-----------来自“初识类”

        这里建立起一个MouseMove的类,并将其作为成员属性添加进鼠标类中


class Mouse{public:/*下列状态表示左击,右击,双击,拖拽,卷动,鼠标平移,升降,冻结*/enum State{LCLICK,RCLICK,DCLICK,DRAG,ROLL,MOVE,RISE,FREEZE};private:State state;MouseMove mouseMove;             //新增鼠标移动类对象public:Mouse();State getState(MouseInfo mi);    //传入鼠标信息类对象,获取状态
}

        2>鼠标显示是动态效果,采用一种思路:动态=静态效果的叠加

        所以建立一个类来实现静态的,初始的效果,也就是资源类,映射到硬件寄存器。目的是屏幕上显示出鼠标的外观。假设鼠标外观是个箭头,命名新类Arrow.

静态类实现

        现在已经有了静态类的目的:屏幕上生成一个箭头,来实现它.

class Arrow{private:vector<Point> points;public:Arrow(int x,int y);接口函数;
}

----接口函数是硬件供应商提供的,把采集到的点传入,得到箭头形状.

     这里我们能做的是采集相应的点.可以在构造方法里写出来..具体如何采集,可以自己硬写,也可以用计算机图形学的知识,笔者没有这方面的知识积累,所以先放一下.

效果类实现

        鼠标在屏幕上移动的效果,可以看作在不同的位置画箭头.

        有了这个思路,可以写出效果类        

class MouseMove{private:MouseInfo mi;                                     //鼠标信息类对象传入public:MouseMove(MouseInfo MI):mi(MI){};                 //构造函数void work();                               
}

        实现鼠标的移动

void MouseMove::work(){int moveTemp=mi.move;                                //提取鼠标横坐标int riseTemp=mi.rise;                                //提取鼠标纵坐标Arrow *arrow=new Arrow(moveTemp,riseTemp);           //生成箭头接口函数;                                            //显示箭头if(mi.move!=moveTemp||mi.rise!=riseTemp){Arrow *new_arrow=new Arrow(mi.move,mi.rise);     //重新生成箭头接口函数;                                        //重新显示箭头 delete(arrow);}
}

代码重构

        如果你没有被上面的代码所吓倒,那么我们可以继续.

        如果我们想要鼠标不只是"箭头"这一种图案,而需要更多选择,例如鼠标做成一朵花flower的图案,那么上面的代码肯定不满足要求.

        现在考虑把MouseMove设置成接口,    

class MouseMove{public:Virtual   void work()=0;                               
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java并发- volatile关键字
  • 【深度学习】使用tensorflow实现VGG19网络
  • mysql mgr集群多主部署
  • 深度学习与机器学习的关系
  • list链表
  • 【AI学习】LangChain学习
  • ArcGIS学习(八)基于GIS平台的控规编制办法
  • 【Node.js】path 模块进行路径处理
  • UE5中的DataTable说明
  • 剪辑视频调色软件有哪些 剪辑视频软件哪个最好 剪辑视频怎么学 剪辑视频的方法和步骤 会声会影2024 会声会影视频制作教程
  • 【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA
  • Sora了解资料
  • OpenHarmony下GN语法普法
  • easyx 枪声模拟器
  • h5网页和 Android APP联调,webview嵌入网页,网页中window.open打开新页面,网页只在webview中打开,没有重开一个app窗口
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Apache的80端口被占用以及访问时报错403
  • Centos6.8 使用rpm安装mysql5.7
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java多线程(4):使用线程池执行定时任务
  • java中具有继承关系的类及其对象初始化顺序
  • vuex 笔记整理
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 搞机器学习要哪些技能
  • 如何在 Tornado 中实现 Middleware
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​io --- 处理流的核心工具​
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)STL算法之遍历容器
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (六)c52学习之旅-独立按键
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)Scala的“=”符号简介
  • (转)VC++中ondraw在什么时候调用的
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .gitignore不生效的解决方案
  • .jks文件(JAVA KeyStore)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net Remoting常用部署结构
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net8.0与halcon编程环境构建
  • .Net多线程Threading相关详解
  • .NET框架设计—常被忽视的C#设计技巧
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .net中我喜欢的两种验证码
  • @Pointcut 使用
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)