明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習分享的學(xué)習平臺!

VB中不規(guī)則圖形熱點的完成

[摘要]所謂圖形熱點就是指定圖形或圖像上的某部分區(qū)域,當鼠標在這部分區(qū)域上單擊或雙擊時,就像命令按鈕一樣會引發(fā)相應(yīng)事件。筆者在VB 5中用Windows提供的三個API函數(shù)輕松實現(xiàn)了任何形狀的圖形熱點,在此...
所謂圖形熱點就是指定圖形或圖像上的某部分區(qū)域,當鼠標在這部分區(qū)域上單擊或雙擊時,就像命令按鈕一樣會引發(fā)相應(yīng)事件。筆者在VB 5中用Windows提供的三個API函數(shù)輕松實現(xiàn)了任何形狀的圖形熱點,在此具體介紹這一技術(shù)的實現(xiàn)步驟。
  首先在VB5中新建一"標準EXE工程",設(shè)置窗體Form1的ScaleMode屬性為3。在窗體代碼的聲明部分定義如下三個API函數(shù):
  Private Type POINTAPI
    x As Long
    y As Long
  End Type
  Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  Private Declare Function DeleteObject Lib "gdi32"(ByVal hObject As Long) As Long
  Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long,ByVal x As Long, ByVal y As Long) As Long
  函數(shù)說明:CreatePolygonRgn( )函數(shù)是用來創(chuàng)建一個圖形熱點對象,lpPoint參數(shù)為形成圖形熱點區(qū)的第一個邊界點坐標,nCount參數(shù)指出了邊界點的個數(shù)(如nCount<3時,將無法形成一個封閉區(qū)域),nPolyFillMode參數(shù)指定填充模式,該函數(shù)返回圖形熱點對象(Long型);DeleteObject( )函數(shù)用來刪除一個由hObject參數(shù)指定的對象;PtInRegion( )函數(shù)用來判斷某坐標(由參數(shù)x、y指出)是否在hRgn圖形熱 點對象指出的熱點區(qū)內(nèi),若是返回1,否則返回0。
  其次在申明部分再添入下列自定義變量:
  Const MAXCOUNT = 30 '熱點區(qū)邊界點的最多個數(shù)
  Dim RgnPt(MAXCOUNT) As POINTAPI '熱點數(shù)組
  Dim RgnObject, RgnCount, flag As Long
  然后在Form1窗體的上方創(chuàng)建一個PictureBox控件,設(shè)置名稱為P1 ,ScaleMode屬性為3,Picture屬性指定一幅BMP圖像。在P1的MouseMove事件和MouseDown事件中添入下列代碼:
  Private Sub P1_MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
   If button = 1 Then '必須按下鼠標左鍵才有效
    RgnPt(RgnCount).x = x
    RgnPt(RgnCount).y = y
    RgnCount = RgnCount + 1
   End If
  End Sub
  Private Sub P1_MouseMove(button As Integer, shift As Integer, x As Single, y As Single)
   If PtInRegion(RgnObject, x, y) = 1 Then
    Label1.ForeColor = QBColor(12)
    Label1.Caption = " 進入圖形熱點區(qū)!鼠標形狀變?yōu)樯陈睿?quot;
    P1.MousePointer = 11 '設(shè)置鼠標形狀為沙漏狀
   ElseIf flag = 1 Then
    Label1.ForeColor = 0
    Label1.Caption = " 沒有進入圖形熱點區(qū)!"
    P1.MousePointer = 0
   End If
  End Sub
  接著在P1的下方并排創(chuàng)建兩個CommandButton控件,Caption屬性分別設(shè)為"創(chuàng)建熱點"和"使用熱點", 名稱分別設(shè)為CrtRgn(對應(yīng)"創(chuàng)建熱點")和DspRgn。在這兩個命令按鈕的下方創(chuàng)建一個Label控件作為操作 提示區(qū),取默認名Label1,Caption屬性設(shè)為空,BackColor設(shè)為白色, BorderStyle屬性設(shè)為1,字體為黑體加粗小四號。雙擊CrtRgn和DspRgn,在它們的Click事件中分別添入以下代碼:
  Private Sub CrtRgn_Click()
   Dim tmp As Long
   RgnCount = 0
   tmp = DeleteObject(RgnObject)
   Label1.Caption = " 在圖像上單擊鼠標左鍵來創(chuàng)建圖形熱點的范圍!"+ _
    "至少應(yīng)在不同位置單擊三次以上,否則形不成封閉區(qū)域!"
   flag = 0
  End Sub
  Private Sub DspRgn_Click()
   RgnObject = CreatePolygonRgn(RgnPt(0), RgnCount, 1)
   flag = 1
  End Sub
  最后在窗體代碼的任意位置添入Form_Load()事件:
  Private Sub Form_Load()
   ScaleMode = 3
   P1.ScaleMode = 3
  End Sub
  按F5運行后,首先單擊"創(chuàng)建熱點"按鈕,在圖像區(qū)域內(nèi)的不同位置 單擊鼠標左鍵,最好單擊三次以上,否則形不成熱點區(qū)。然后單擊"使用熱點"按鈕,在圖像框內(nèi)移動鼠標,你會發(fā)現(xiàn)當鼠標進入熱點區(qū)后, 形狀變?yōu)樯陈睢1疚闹械某绦騼H為演示程序,在實際應(yīng)用中,可以事先創(chuàng)建好熱點區(qū)數(shù)組,然后在熱點區(qū)的MouseDown( )事件中添入相應(yīng)的代碼,即可使用圖形熱點代替命令按鈕。
  本程序在VB5/Win 95、Win 98下通過。