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下通过。->
首先在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下通过。->
更多精彩
赞助商链接