所謂圖形熱點就是指定圖形或圖像上的某部分區域,當鼠標在這部分區域上單擊或雙擊時,就像命令按鈕一樣會引發相應事件。筆者在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下通過。->