VB中不规则图形热点的实现

2016-02-19 16:33 81 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是VB中不规则图形热点的实现,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

所谓图形热点就是指定图形或图像上的某部分区域,当鼠标在这部分区域上单击或双击时,就像命令按钮一样会引发相应事件。笔者在VB5中用Windows提供的三个API函数轻松实现了任何形状的图形热点,在此具体介绍这一技术的实现步骤。
  首先在VB5中新建一"标准EXE工程",设置窗体Form1的ScaleMode属性为3。在窗体代码的声明部分定义如下三个API函数:
  PrivateTypePOINTAPI
  xAsLong
  yAsLong
  EndType
  PrivateDeclareFunctionCreatePolygonRgnLib"gdi32"(lpPointAsPOINTAPI,ByValnCountAsLong,ByValnPolyFillModeAsLong)AsLong
  PrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLong
  PrivateDeclareFunctionPtInRegionLib"gdi32"(ByValhRgnAsLong,ByValxAsLong,ByValyAsLong)AsLong
  函数说明:CreatePolygonRgn()函数是用来创建一个图形热点对象,lpPoint参数为形成图形热点区的第一个边界点坐标,nCount参数指出了边界点的个数(如nCount3时,将无法形成一个封闭区域),nPolyFillMode参数指定填充模式,该函数返回图形热点对象(Long型);DeleteObject()函数用来删除一个由hObject参数指定的对象;PtInRegion()函数用来判断某坐标(由参数x、y指出)是否在hRgn图形热点对象指出的热点区内,若是返回1,否则返回0。
  其次在申明部分再添入下列自定义变量:
  ConstMAXCOUNT=30'热点区边界点的最多个数
  DimRgnPt(MAXCOUNT)AsPOINTAPI'热点数组
  DimRgnObject,RgnCount,flagAsLong
  然后在Form1窗体的上方创建一个PictureBox控件,设置名称为P1,ScaleMode属性为3,Picture属性指定一幅BMP图像。在P1的MouseMove事件和MouseDown事件中添入下列代码:
  PrivateSubP1_MouseDown(buttonAsInteger,shiftAsInteger,xAsSingle,yAsSingle)
   Ifbutton=1Then'必须按下鼠标左键才有效
  RgnPt(RgnCount).x=x
  RgnPt(RgnCount).y=y
  RgnCount=RgnCount 1
   EndIf
  EndSub
  PrivateSubP1_MouseMove(buttonAsInteger,shiftAsInteger,xAsSingle,yAsSingle)
   IfPtInRegion(RgnObject,x,y)=1Then
  Label1.ForeColor=QBColor(12)
  Label1.Caption="进入图形热点区!鼠标形状变为沙漏状!"
  P1.MousePointer=11'设置鼠标形状为沙漏状
   ElseIfflag=1Then
  Label1.ForeColor=0
  Label1.Caption="没有进入图形热点区!"
  P1.MousePointer=0
   EndIf
  EndSub
  接着在P1的下方并排创建两个CommandButton控件,Caption属性分别设为"创建热点"和"使用热点",名称分别设为CrtRgn(对应"创建热点")和DspRgn。在这两个命令按钮的下方创建一个Label控件作为操作提示区,取默认名Label1,Caption属性设为空,BackColor设为白色,BorderStyle属性设为1,字体为黑体加粗小四号。双击CrtRgn和DspRgn,在它们的Click事件中分别添入以下代码:
  PrivateSubCrtRgn_Click()
   DimtmpAsLong
   RgnCount=0
   tmp=DeleteObject(RgnObject)
   Label1.Caption="在图像上单击鼠标左键来创建图形热点的范围!" _
  "至少应在不同位置单击三次以上,否则形不成封闭区域!"
   flag=0
  EndSub
  PrivateSubDspRgn_Click()
   RgnObject=CreatePolygonRgn(RgnPt(0),RgnCount,1)
   flag=1
  EndSub
  最后在窗体代码的任意位置添入Form_Load()事件:
  PrivateSubForm_Load()
   ScaleMode=3
   P1.ScaleMode=3
  EndSub
  按F5运行后,首先单击"创建热点"按钮,在图像区域内的不同位置单击鼠标左键,最好单击三次以上,否则形不成热点区。然后单击"使用热点"按钮,在图像框内移动鼠标,你会发现当鼠标进入热点区后,形状变为沙漏状。本文中的程序仅为演示程序,在实际应用中,可以事先创建好热点区数组,然后在热点区的MouseDown()事件中添入相应的代码,即可使用图形热点代替命令按钮。
  本程序在VB5/Win95、Win98下通过。->

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

延伸阅读
在VISUALBASIC中没有什么命令或函数能够实现将一个位图旋转一个角度后显示出来,但我们可以用画点的方式,将一个图画盒中的位图中的像素点旋转一个角度后画入另一个图画盒中,当源图画盒中的像素都被画到目标图画盒中时,也就完成了位图的旋转。这里主要用到了VISUALBASIC中的两个方法:POINT方法和PSET方法。POINT方法的作用是从源图画盒中提取...
形态各异的不规则窗体 作者:李晓飞 下载本文示例工程 说起不规则窗体也许我们大家都会觉得新鲜,这是因为我们平日里绝大部分窗体用的都是正规正矩的矩形窗体,Word这个大名鼎鼎的软件想必大家都已用过,那么在Word里就按下你手中的F1键吧,弹出的窗体形态怎么样,很炫吧!(如下图所示)。 ...
----在VISUALBASIC中没有什么命令或函数能够实现将一个位图旋转一个角度后显示出来,但我们可以用画点的方式,将一个图画盒中的位图中的像素点旋转一个角度后画入另一个图画盒中,当源图画盒中的像素都被画到目标图画盒中时,也就完成了位图的旋转。 ----这里主要用到了VISUALBASIC中的两个方法:POINT方法和PSET方法。POINT方法的作用...
    在多媒体软件中,用MMB(“Multimedia Builder”)实现不规则透明窗口比较容易,Authorware借助插件也能实现(电脑报已有介绍),用Director实现不规则窗口大家可能还不太熟悉。有些朋友认为靠Director本身不能实现,跟Authorware一样也需要借助第三方插件支持才可以,其实不然,不用任何插件,Director本身就可以做出来,...
->设置各控件的属性如下: Form1:AutoRedraw:True ScaleMode:3 Picture1:AutoRedraw:True ScaleMode:3 Visible:False 2代码编写 Modull.bas中的内容(声明BitBlt函数): PublicConstSRCCOPY=&HCC0020'(DWORD)dest=source DeclareFunctionBitBltLib"gdi32"Alias"BitBlt"(ByValhDestDCAsLon...

经验教程

278

收藏

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