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 不规则 图形

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