怎么做企业网站二维码扫描,柳州建设网经济适用房,厚街镇做网站,wordpress编程前言 光做理论上的总结,不做练习理解不会那么深刻 做类的练习,解析类里面的内容有哪些
引入 电脑使用最频繁的两个外设:鼠标和键盘,他们每时每刻都在和用户交互,试做一个鼠标类
思路 我们现在要做一个鼠标类,这个类是属于能动类还是资源类呢?鼠标似乎自己做不了什么,需要和其…前言 光做理论上的总结,不做练习理解不会那么深刻 做类的练习,解析类里面的内容有哪些
引入 电脑使用最频繁的两个外设:鼠标和键盘,他们每时每刻都在和用户交互,试做一个鼠标类
思路 我们现在要做一个鼠标类,这个类是属于能动类还是资源类呢?鼠标似乎自己做不了什么,需要和其他对象交互才能产生效果,在有的书上也被称作事件类.他们的使用大概是这个样子的:
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_rolltrue;freeze_movetrue;freeze_risetrue;freeze_alltrue;} void MouseInfo::freezeJudge() //冻结状态判断{int rollTemproll; //存储当前roll值;int mTempmove; //存储当前平移值;int rTemprise; //存储当前升降值;sleep(50); //延时50毫秒freeze_roll(rollrollTemp)?true:false; //滚动判定freeze_move(mTempmove)?true:false; //平移判定freeze_rise(rTemprise)?true:false; //升降判定if(left_click!1right_click!1freeze_rollfreeze_movefreeze_rise)freeze_alltrue; //鼠标没输出elsefreeze_allfalse; } 说明: 定义了几个状态判定变量是否状态发生变化
类的内容 类的内容有属性和方法,属性表示对象由什么组成,以及处于某种状态. 属性是对于对象组成部分和对象状态的描述. 属性和对象的关系如下: 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_click1){mi.left_click0; //人为将该值置0sleep(500);if(mi.left_click1)return DCLICK;elsereturn LCLICK; //左键单击或双击判定if(mi.right_click1)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_click1){mi.left_click0; //人为置0sleep(500); //延时0.5秒if(mi.left_click1) //采集信息如果双击或长按将采集到1mi.left_click0; //再次人为置0if(mi.left_click0) //如果采集到0 return DCLICK; //双击状态确定else //如果采集到1作为长按确定长按不作为单独状态mi.freezeJudge(); //冻结判定if(!mi.freeze_move||!mi.freeze_rise) return DRAG; //拖拽确定 elsereturn LCLICK; //单击确定}if(mi.right_click1)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; //鼠标处于冻结状态确定
}
说明其间顺序不是绝对的优先级可以自己定义。
再次声明代码非可直接使用主要是思路
未完待续。。。