不规则图元的选择,VC++

来源:百度知道 编辑:UC知道 时间:2024/05/21 14:30:21
有两个问题请问各位高手
1、在 VC++中绘图,对于不规则的图形如何选择,例如直线,我可以定义一个链表,把每一条直线加入链表,鼠标按下时,通过点到直线的距离就可以判断选择,圆形,方形,椭圆等其他规则图形都可以。但是对于不规则图形例如我随意画了一条曲线,那怎么选择呢?
2、对于VC++中的绘图,例如我要绘制一条直线,此时画板上已经有红、蓝等多种颜色,我绘制时 当按下鼠标后我先记录该点,鼠标移动事件中我先通过
SetROP2(R2_NOTXORPEN),擦除上一次绘制的直线,然后在绘制现在的,但是这个有个不好处,就是我要绘制的直线是红色,但当这条直线通过红色区域时,红色区域中直线的颜色变为白色,虽然我可以在鼠标按键抬起事件中重绘这条直线,但感觉不好。例如系统自带的绘图软件就没有这种现象。请问各位高手你们是怎么做的,使直线通过任意颜色的区域,直线的颜色还是原来的色彩,而且还能把上一次的直线擦掉(就和绘制前一样)。

200分是最高分了,不能再加了,如果能加我愿意用1000分给与答谢!
我用过双缓冲方式,在内存中我建立了与绘图区相同的区域,在鼠标移动事件中先把内存中的区域bitblt到绘图DC上,然后在绘制,这样对于像素只有1的直线,等其他图形来说是可以的,但对于像素为2及其以上特别是绘制实心矩形时,矩形中心闪的厉害,我就想能否可以只bitblt没有被实心矩形等图元覆盖的区域。

谢谢大家的帮助,我的邮箱是zhguyi321@yahoo.com.cn,不过大家还是贴上来好,这样大家可以相互学习!

楼主做的是矢量图?还是位图??

如果是矢量图,因为矢量图总是按照某种“算法”画出来的。计算点到图形的距离也有“算法”支持。如果是位图,对于你随意画的线条,如果你要保存这个线条,你一定会保存它一系列的点,那么你就可以用鼠标坐标去逐一判断与这些点的距离。
因此,对于第一个问题,建议一个如下的思路,也许你已经这么做了。
创建一个图形基类,该基类事实上是一个接口:
class 图形基类
{
public:
virtual void Draw( CDC * pDC ) = 0; // 画图形
virtual BOOL IsPointOnIt( CPoint& pt ) = 0; // 判断选中
........
};
创建一系列的图形元素,派生自图形基类
class 圆 : public 图形基类
{
public:
virtual void Draw( CDC * pDC ) { 画圆; }
virtual BOOL IsPointOnIt( CPoint& pt ) { 利用圆公式判断点是否在上面; }
};

class 曲线 : public 图形基类
{
public:
virtual void Draw( CDC * pDC ) { 画曲线; }
virtual BOOL IsPointOnIt( CPoint& pt ) { 判断散列点集合到点的距离; }
};

................

-------------------------
对于第二个问题:

这一这么做,画图形之前,首先要保存将要被覆盖的背景图,然后画上线。需要擦除的时候,把保存的背景图再贴上。
不过还有一个更简单的方法,就是使用“双缓冲”。每次的画图操作,都画在一个位图中,而不是真实的屏幕上。画图完成之后,再把位图一次性贴到窗口客户区(屏幕上)。这样不仅可以解决那个问题,而且还可以防止闪烁。<