前言
续鼠标类设计之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);
}
}