如何在VB中实现绘图区的大十字光标

2016-02-19 20:14 37 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享如何在VB中实现绘图区的大十字光标吧。

【 tulaoshi.com - 编程语言 】

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

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

----要实现这样的光标,得我们自己通过画线的方式实现。如鼠标在绘图控件内,先在鼠标的当前位置画上光标的横线和竖线;当鼠标位置移动,先擦除原先的光标横线和竖线,然后再在新的位置画光标的横线和竖线,那么我们就要响应绘图控件的MouseMove事件。当然,绘图控件内无论有什么内容,我们擦除光标线和重画光标线时都不能破坏原先的内容,因此我们要将绘图控件的DrawMode设置为vbXorPen(异或方式),绘制光标的横线和竖线时,用异或的方式将横线和竖线的象素点颜色设为光标的颜色和原先的象素点色彩的异或值,再用异或的方式在同样的位置绘制一遍竖线和横线,横线和竖线上的象素点再一次和光标颜色进行异或操作,就擦除了光标的横线和竖线,且又恢复了绘图控件内原先的内容。

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

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

----以下我们通过一个示例来完整实现绘图控件中的大十字光标,还演示如何实现用“橡皮筋”效果来画矩形:

----在VB中新建一个标准EXE工程,在Form1中加入一个Picture控件,其Name设为PicDraw,可以装入一个图象文件,PicDraw的大小和其中的图象大小基本上覆盖大部分的Form1即可。实现代码如下所示。此程序在VB5.0中运行通过。

OptionExplicit
  PrivateOld_XAsSingle
  PrivateOld_YAsSingle
  PrivateisMouseDownAsBoolean
  PrivateBox_X0AsSingle
  PrivateBox_Y0AsSingle
  PrivateBox_X1AsSingle
  PrivateBox_Y1AsSingle
  PrivatePenColorAsLong
  PrivateCrossColorAsLong
  
  PrivateSubForm_Load()
  CrossColor=QBColor(8)
  PenColor=QBColor(15)
  picDraw.DrawMode=vbXorPen
  picDraw.MouseIcon=LoadPicture
  (App.Path&"o.cur")
  picDraw.MousePointer=vbCustom
  isMouseDown=False
  Box_X0=Box_X1=Box_Y0=Box_Y1=0
  EndSub
  
  PrivateSubpicDraw_MouseDown
  (ButtonAsInteger,
  ShiftAsInteger,XAsSingle,YAsSingle)
  IfisMouseDown=TrueThen
  '先前已经用鼠标定义了一个点
  Box_X1=X
  Box_Y1=Y
  isMouseDown=False
  picDraw.DrawMode=vbCopyPen
  picDraw.Line(Box_X0,Box_Y0)-
  (Box_X1,Box_Y1),
  PenColor,B
  picDraw.DrawMode=vbXorPen
  '画一个光标
  picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
  CrossColor
  picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
  CrossColor
  Old_X=X
  Old_Y=Y
  Else
  '定义了一个矩形的第一个顶点,则擦除光标
  picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
  CrossColor
  picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
  CrossColor
  Box_X0=X
  Box_Y0=Y
  isMouseDown=True
  EndIf
  EndSub
  
  PrivateSubpicDraw_MouseMove(ButtonAsInteger,
  ShiftAsInteger,XAsSingle,YAsSingle)
  IfisMouseDown=TrueThen
  '拖动鼠标来定义矩形的另外一个顶点,
  此时擦除前一个矩形,绘制新的矩形
  picDraw.Line(Box_X0,Box_Y0)-(Old_X,Old_Y),
  PenColor,B
  picDraw.Line(Box_X0,Box_Y0)-(X,Y),PenColor,B
  Else
  '消除旧光标线
  picDraw.Line(0,Old_Y)-(picDraw.ScaleWidth,Old_Y),
  CrossColor
  picDraw.Line(Old_X,0)-(Old_X,picDraw.ScaleHeight),
  CrossColor
  '画新的光标线
  picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
  CrossColor
  picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
  CrossColor
  EndIf
  Old_X=X
  Old_Y=Y
  EndSub->

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1623088.html

延伸阅读
标签: 刺绣 十字绣
花了不少钱将千挑万选的 十字绣 图案买回,又投入了大量的时间和精力完成了它的绣制,一直到完成,上面的每一针都沾满了我们的心思,最后一步的装裱当然也马虎不得。如果因为装裱问题影响到整体效果,那么我们那么长时间的心血就白费了。 1、这是框的背面。 2、将卡纸取出,擦干净框子上的玻璃。 3、十字...
当您开始用第一条绣花线时,请在布料背后预留1cm长的线尾。用手指按住线尾,然后开始刺绣。在进行刺绣时,用针步将线尾固定下来。完成一条绣花线后,只需在布料背后连针带线穿过几个针步,并将余下的线段剪去便可。 十字绣怎么绣?十字绣的绣法 十字绣怎么绣 十字绣的基本材料是刺绣线和特殊工艺制作的网格面料,只要有设...
十字绣图案精美秀丽,让人感觉十字绣图案欣赏起来是一种美的享受,但是十字绣图案绣起来也需要一定的技巧和正确的针法。下面一起来看看中国十字锈针法的针法介绍哦! 1、全针绣法(X) 先由网眼1穿上来,再由网眼2穿下去,再由网眼3穿上来,再由网眼4穿下去,再网眼5穿上来,再由网眼2下去,再由网眼3上来,再由网眼6下去,以次类推...
标签: 刺绣 十字绣
前些天从淘宝网上网购了一幅“荷花鲤鱼图”的 十字绣 绣图,有一些地方需要进行勾边,于是在今天早上将第一根线刚刚绣完的时候,突然的灵光一闪,想出了一个不错的小方法,在这里63diy跟大家一起来分享一下。 一般我们在勾边的时候用的是回针法,这样背面就有一段段的线,有横有竖很难看,如果背线从绣的线和布的线都是竖...
标签: 刺绣 十字绣
很多 十字绣 爱好者在绣制前都习惯于将绣布画上格子,而画格子在十字绣的绣制中也属于最基础的东西,是尽量要掌握的十字绣常识,今天在这里,图老师就教教大家怎样简单地在绣布上画格子,先准备一只水溶性的笔,再准备一把尺子,就可以开始画格子了。 1、绣布平铺。 2、将绣布对折。 3、再次对折,绣布就分成...

经验教程

804

收藏

98
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部