读书人

矢量图怎么响应键盘和鼠标事件

发布时间: 2012-02-08 19:52:21 作者: rapoo

矢量图如何响应键盘和鼠标事件
我们常常使用一些矢量作图软件,如AutoCAD,几何画板等,这些软件中的图形看上去是可以响应鼠标事件的,不知道它们是怎么实现的.
我也想实现相同的功能,于是设计了基类Shape用于提供接口,接下来又由Shape派生了子类Line,MLine,Circle等等.以Line为例,它只包含两个端点的坐标点的数据,在此基础上,如果想让它响应鼠标事件,我需要怎么做?是不是Shape必需由MFC类派生?如果不使用MFC,那么我必需要做哪些工作才行呢?

[解决办法]
不一定要MFC的

首先要建立一个链表之类的数据结构,把你的shape管理起来
然后要设计比如如何就是选中某个shape的办法
接着就是考虑如何响应键盘等,把shape位移,(比如直线, 两个端点都移动一定象素)
最后就是刷新你的UI,反映出移动的效果

大体上就这样,网上类似画图板的代码还是很多的,自己找找
[解决办法]
捕获WINDOWS的消息然后响应
[解决办法]
你为何要让类捕获windows消息啊,难道你的每个几何图形都要变成窗口么?呵呵

只要UI主界面能捕获到就可以了,然后判断选中的是哪一个,然后对该对象进行操作就可以了
[解决办法]

C/C++ code
virtual   void   Select(){bSelected=true;} virtual   void   Deselect(){bSelected=false;} virtual   bool   Selected(){return   bSelected;} virtual   void   OnMouseDown(long   x,long   y)=0; virtual   void   OnMouseUp(long   x,long   y)=0; virtual   void   OnMouseMove(long   x,long   y)=0; 子类中实现后面的三个函数.接下来在View的OnMouseDown()中写如下的代码: for(int   i=0;i <ShapeCount;i++) {         Shape[i]-> OnMouseDown(long   x,long   y);         if(Shapes[i]-> Selected())   break; }效率的话,可以考虑放弃继承,用模板,静多态来实现,
[解决办法]
>>但是这样做总是感觉效率很低,特别是BCB中,当图元很多时,会有明显的闪屏.
画图一定要用双缓冲,多只会慢,闪和多没有关系
[解决办法]
WINDOWS的消息处理机制
[解决办法]
To cleverwyq:
请问是不是必须是窗口才可能响应Windows消息?
==========
据我所知,是的
[解决办法]
同意8楼大哥的,
双缓存处理刷屏现象...
[解决办法]
几何图形能够自已响应Windows消息更好一些??
这些几何图形类派生于CWnd?
这样的设计太糟糕了吧.
还是窗口响应消息,然后对消息处理(比如:计算出点击的是什么图形,图形的什么地方等等),然后再调用图形的相应方法.

读书人网 >C++

热点推荐