实现绘图区的大十字光标

前端之家收集整理的这篇文章主要介绍了实现绘图区的大十字光标前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

有时,我们需要用VB快速开发一个试验数据绘图处理程序,将绘图控件内的鼠标光标改变成与AutoCAD软件中使用的大十字光标的形式,将可以比普通的箭头光标达到更好的效果。那么我们如何实现这样的大十字光标呢?

----首先,我们明确一下要达到的效果,假若我们在一个Picture控件中绘图,那么,鼠标移动到这个控件上时,鼠标光标立即改变为大十字形状,光标中的横线从控件的左边界到右边界,竖线从控件的上边界到下边界,即大十字光标将绘图控件分割为四个象限。当鼠标移动到控件外时,光标则又恢复成原来的形式。

----要实现这样的光标,得我们自己通过画线的方式实现。如鼠标在绘图控件内,先在鼠标的当前位置画上光标的横线和竖线;当鼠标位置移动,先擦除原先的光标横线和竖线,然后再在新的位置画光标的横线和竖线,那么我们就要响应绘图控件的MouseMove事件。当然,绘图控件内无论有什么内容,我们擦除光标线和重画光标线时都不能破坏原先的内容,因此我们要将绘图模式SetROP2设置为R2_XORPEN

(异或方式),绘制光标的横线和竖线时,用异或的方式将横线和竖线的象素点颜色设为光标的颜色和原先的象素点色彩的异或值,再用异或的方式在同样的位置绘制一遍竖线和横线,横线和竖线上的象素点再一次和光标颜色进行异或操作,就擦除了光标的横线和竖线,且又恢复了绘图控件内原先的内容

----我们还得保证鼠标移动到绘图控件内时,普通的鼠标光标消失,只有绘制的大十字光标出现,因此还应该设置绘图控件的MousePointer属性为vbCuntom,即用户自定义。绘图控件的MousePointer属性设置为vbCustom后,其MouseIcon属性中应装入相应的用户自定义图形,因为我们希望绘图控件内只有我们绘制的光标,而没有其它的光标,故应该装入一个空的(透明的)光标图形。可以任找一个光标文件,通过任意一个资源编辑器对其进行编辑,用透明的方式填充整个光标图形,保存成我们所需的NoIcon.cur即可。

----通过以上的关键设置和操作,我们就可以实现大十字光标了。利用异或方式进行绘图,我们还可以实现一般绘图软件中常有的“橡皮筋”效果,即用鼠标定义一个点后,动态拖动鼠标来定义另外一个点,动态拖动鼠标过程中,所要绘的图形也动态相应变化。

CDC* pDC = GetDC();
CRect rt;
GetClientRect(&rt);
COLORREF XorColor = pDC->GetBkColor() ^ RGB(64,64,112);
int oldDrawMode = pDC->SetROP2(R2_XORPEN);
CPen pen(PS_SOLID,1,XorColor);
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rt.left,oldpt.y);
pDC->LineTo(rt.right,oldpt.y);
pDC->MoveTo(oldpt.x,rt.top);
pDC->LineTo(oldpt.x,rt.bottom);
pDC->MoveTo(rt.left,pt.y);
pDC->LineTo(rt.right,pt.y);
pDC->MoveTo(pt.x,rt.top);
pDC->LineTo(pt.x,rt.bottom);
pen.DeleteObject();
pDC->SetROP2(oldDrawMode);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);

摘自:http://www.mscto.com/vb/2009021430398.html

猜你在找的VB相关文章