说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
VB如何在VB中实现绘图区的大十字光标
作者:吴鹏炜
有时,我们需要用VB快速开发一个试验数据绘图处理程序,将绘图控件内的鼠标光标改变成与AutoCAD软件中使用的大十字光标的形式,将可以比普通的箭头光标达到更好的效果。那么我们如何实现这样的大十字光标呢?
---- 首先,我们明确一下要达到的效果,假若我们在一个Picture控件中绘图,那么,鼠标移动到这个控件上时,鼠标光标立即改变为大十字形状,光标中的横线从控件的左边界到右边界,竖线从控件的上边界到下边界,即大十字光标将绘图控件分割为四个象限。当鼠标移动到控件外时,光标则又恢复成原来的形式。

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

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

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

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

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

Option Explicit
Private Old_X As Single
Private Old_Y As Single
Private isMouseDown As Boolean
Private Box_X0 As Single
Private Box_Y0 As Single
Private Box_X1 As Single
Private Box_Y1 As Single
Private PenColor As Long
Private CrossColor As Long

Private Sub Form_Load()
CrossColor = QBColor(8)
PenColor = QBColor(15)
picDraw.DrawMode = vbXorPen
picDraw.MouseIcon = LoadPicture
(App.Path & "\no.cur")
picDraw.MousePointer = vbCustom
isMouseDown = False
Box_X0 = Box_X1 = Box_Y0 = Box_Y1 = 0
End Sub

Private Sub picDraw_MouseDown
(Button As Integer,
Shift As Integer, X As Single, Y As Single)
If isMouseDown = True Then
'先前已经用鼠标定义了一个点
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
End If
End Sub

Private Sub picDraw_MouseMove(Button As Integer,
Shift As Integer, X As Single, Y As Single)
If isMouseDown = True Then
'拖动鼠标来定义矩形的另外一个顶点,
此时擦除前一个矩形,绘制新的矩形
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
End If
Old_X = X
Old_Y = Y
End Sub

Twitter实时分析平台主要合作伙伴Dataminr:让用户不再错过重要的推文 OpenStack、OpenNebula、Eucalyptus、CloudStack社区活跃度比较 XOR的黄色大象:Erasure Code为Hadoop节省数据恢复带宽 竞争将越来越激烈:戴尔或也进军可穿戴计算市场 新技术:可直接在人脑播放广告 编程调试和诊断的五大规则 70%开发者:对现有应用推广和广告并不满意 四种方案:将OpenStack私有云部署到Hadoop MapReduce环境中 扩展PHP的五个简单技巧,让单服务器并行支撑30000用户 硅谷为什么无法复制 PubNub+Cloudinary:简单几步快速搭建实时图片分享应用 影响互联网行业的十大API(信息图) Hadoop+GPU强强联手的性能探索 Eurora获最节能超算殊荣,中国天河2号位列第31 程序员的野心:让GPU像CPU一样运行 Gungho热潮正在逐渐消退? Thalmic创始人专访:穿戴式体感设备MYO背后的开发故事 移动周报:GSMA各种神器,Qt 5.1,Android 4.3,本周惊喜多多! 奇虎360Web平台部基础架构团队访谈:开源线上数据库中间件Atlas 化繁为简:UC优视发布“UC+”开放平台战略 从40亿美元到10亿美元 Hulu的美梦是否又一次成为泡影? 百度开发者俱乐部第六期:BAE3.0开放内测 云编程马拉松启动 微软宣布将于今年9月30日正式关闭MSN TV服务 程序员不应该再犯的五大编程错误 中国开源事业,路在何方? StackOverflow上的编程趋势 Oracle悄然将Berkeley DB许可证更改为AGPL 简单易用,保护隐私:麻省理工的邮件数据挖掘分析工具Immersion Microsoft Ventures进入中国,为云生态系统构建提供加速度! 这是场战争:盘点那些参与智能手表竞争的厂商 三星豪掷80万美元奖金 第二届全球开发者挑战赛开幕 寻求可共享的稳定的FTP 为什么文件没有被下载?!急 请问这是什么错误? 有关DATAGRID中((HyperLink)e.Item.Cells[0].Controls[0].FindControl("HyperLink2")).Text的问题,请帮帮我!! Include 的疑惑 寻找一个叫dingke的朋友,我将把邮箱给你,但我不小心弄丢了你的联系信箱,请速与我联系 为什么delphi程序总是有sysinit和system单元? 哪里有完整的MINE解码组件 有关关机程序的问题,帮帮忙。 安装树的问题?????????? 求助!关于ip地址数据库的 读多个串口时为什么时钟停止了? 安装树的问题?????????? 请教FxScanner是什么程序? 请大家出主意 为什么总是让我下载java虚拟机 调查一下大家在用VB做软件时最常用哪些控件呀, DataGrid_UpdateCommand里怎么取不到变化后的值 求助!关于ISAPI的问题? 一个简单问题,高分求解。。 我是东东树的妹妹,我有问题要问大家。关于jsp页面重定向问题? system.globaliztion.cultureinfo("en_US") 是不是C#中要进行字符集的转换处理 请问以下构造函数的sql有什么错误?提示AS附近由于发错误,字段名可以用变量吗? windows2000与windows2003的互相访问的问题? 一个简单基本的问题求教高手,急在线等 Blue Workshop产品消息:.Net插件Replace it 1.3在CSDN和www.skycn.com.cn总下载量突破900次; SharpRefactor(C#代码重构工具)在CSDN的下 J2ME中文显示问题,急!! ado.net 我发现JSP一个奇怪的问题???想要看看吗???进来呀!!! 昨晚2点多一个mm突然打电话找我聊天,各位觉得我有戏没? 哪里有完整的MINE解码组件 为什么我装完FreeBSD系统启动时Sendmail启动的特别慢,telnet时也很慢。 小弟初学JSP,想搞点源代码来学习学习。 难搞的MIDAS 局域网的问题,急死了, vb中继承及分辨率问题 ASP里有没有带下拉框的输入框? 象素数据和图象数据 公司的一个数据库被人del,现在想查查是谁什么时候做的? 为什么我的窗口无法操作 关于oracle数据库增量备份土土的一问。 ArrayList问题 请教:在CB6下面怎么用 TMediaPlayer 控件来录音? 南开的vb习题集!!! 请问:如何在servlet中获得当前时间和当前日期?菜鸟问题,请见谅。 为什么我的opendialog不能返回filename,而返回了一个 $符号 大家对购买tcl笔记本等国产笔记本有没有什么建议? 第一次用vfp,新手提问? 请问哪位大虾知道,Crystal 7.0如何记忆上次打印该报表的打印机 纸张大小 纸张方向 边界设定等 如何自动生成新页? 显示器问题!! 100分只求几句搞笑而幽默的话句?例如睡着睡着还没天亮就醒来了:郁闷:梦总是被尿憋醒.----因为以前太过掏心掏肺了,所以搞的现在没心没肺.一两句就OK 为什么宋江能当上梁上头领 求that astounding creators-Nature中文翻译 铁的东西生锈用化学东西擦去表面的锈以后铁里面的物质有没有减少,或者质量减少了麽?我很费解… 正在电风扇的呼呼声中打瞌睡的他被老师叫起来回答问题.他站起来,极力睁开双眼望着老师,他 续写睁开双眼后面还有:睁开双眼望着老师,在听到背后同学重复提示后他……………… 续写 综 《我的老师》中在睡眠状态下,“我”竟然能够站起来就往外走,这是为什么?请用文中句子回答 一个十字,两边各一个人字,下面一个日字,右边是一个力字.这个字念什么? 小学科学年级 食物网怎么连?稻草。毛毛虫。小鸟。老鹰。猫头鹰。黄鼠狼。田鼠。白鹭。鱼蝗虫,青蛙 铜在酸性环境中易发生析氢腐蚀 这句话为什么不对 如何防止铜在酸性的过氧化氢溶液中被腐蚀. 奇迹的英文? 美国药监局将限制使用多种致瘾性处方止旧金山举办“安全街道日”活动宣传安全男子假冒将军谎称中央领导女婿 诈骗超朝鲜在联大声称将继续发射卫星 抵制安日本创意小商品 别针收纳箱美共和党参议员计划推迟耶伦的美联储主美华裔家庭母子5人惨遭凶杀 凶手系孩西班牙巴塞罗那发生列车脱轨事故 造成美国旧金山湾区万圣节前多起驾车枪击 一名联合国维和人员在刚果(金)丧生安哥拉中国商会开讲中华礼仪云南曲靖麒麟消防开展突发事件应急处置2014北京国际茶业展将启幕中航重机副总经理吴浩被双规 公司:生最高法发布审理公证民事案件司法解释薛文成:有效统一法律适用 合理平衡各张卫平:公证侵权纠纷诉讼规制的统一与楚雄南华野生菌信息港上线 市民可到网“高考房”预定火爆 昆明各考点周边酒揭秘新疆一线反恐警察的酸甜苦辣惠州农村大额度开支实时监控:村民手机水龙头新国标能否消除消费者“铅招标”
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘