WEB开发网
开发学院WEB开发综合 VB中不规则图形热点的实现 阅读

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

 2006-02-27 11:52:56 来源:WEB开发网   
核心提示:所谓图形热点就是指定图形或图像上的某部分区域,当鼠标在这部分区域上单击或双击时,VB中不规则图形热点的实现,就像命令按钮一样会引发相应事件,笔者在VB5中用Windows提供的三个API函数轻松实现了任何形状的图形热点,然后在热点区的MouseDown()事件中添入相应的代码,即可使用图形热点代替命令按钮,在此具体介绍
所谓图形热点就是指定图形或图像上的某部分区域,当鼠标在这部分区域上单击或双击时,就像命令按钮一样会引发相应事件。笔者在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参数指出了边界点的个数(如nCount<3时,将无法形成一个封闭区域),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下通过。->

Tags:VB 不规则 图形

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接