鼠標事件,可以理解爲操作鼠標的動作。對於窗口而言,用戶操作鼠標,窗口檢測到鼠標的操作( 產生一個信號 ),然後去做相應處理( 調用其規定的回調函數 ),即爲鼠標事件。
窗口默認不捕獲鼠標的操作,需要手動添加讓其捕獲:
//添加鼠標按下事件
//BUTTON_PRESS_MASK: 鼠標按下,觸發信號"button-press-event"
//BUTTON_RELEASE_MASK:鼠標擡起,觸發"button-release-event"
//鼠標移動都是觸發"motion-notify-event"
//BUTTON_MOTION_MASK: 鼠標移動,按下任何鍵移動都可以
//BUTTON1_MOTION_MASK:鼠標移動,按住左鍵移動才觸發
//BUTTON2_MOTION_MASK:鼠標移動,按住中間鍵移動才觸發
//BUTTON3_MOTION_MASK:鼠標移動,按住右鍵移動才觸發
window.SetEvents(int(gdk.BUTTON_PRESS_MASK | gdk.BUTTON1_MOTION_MASK))
事件標識:
事件標識 | 觸發條件 |
---|---|
“button-press-event” | 鼠標按下時觸發 |
“button-release-event” | 鼠標擡起時觸發 |
“motion-notify-event” | 按住鼠標移動時觸發 |
示例代碼:
package main
import (
"fmt"
"os"
"unsafe"
"github.com/mattn/go-gtk/gdk"
"github.com/mattn/go-gtk/glib"
"github.com/mattn/go-gtk/gtk"
)
func main() {
gtk.Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) //新建窗口
window.SetDefaultSize(480, 320) //設置大小
//鼠標按下事件處理
window.Connect("button-press-event", func(ctx *glib.CallbackContext) {
//獲取鼠鍵按下屬性結構體變量,系統內部的變量,不是用戶傳參變量
arg := ctx.Args(0)
event := *(**gdk.EventButton)(unsafe.Pointer(&arg))
if event.Type == int(gdk.BUTTON_PRESS) { //單擊
fmt.Printf("單擊, ")
} else if event.Type == int(gdk.BUTTON2_PRESS) { //雙擊
fmt.Printf("雙擊, ")
}
//fmt.Println("button = ", event.Button)
if event.Button == 1 {
fmt.Printf("左鍵, ")
} else if event.Button == 2 {
fmt.Printf("中間鍵, ")
} else if event.Button == 3 {
fmt.Printf("右鍵, ")
}
fmt.Println("座標:", int(event.X), int(event.Y))
})
//鼠標移動事件處理
window.Connect("motion-notify-event", func(ctx *glib.CallbackContext) {
//獲取鼠標移動屬性結構體變量,系統內部的變量,不是用戶傳參變量
arg := ctx.Args(0)
event := *(**gdk.EventMotion)(unsafe.Pointer(&arg))
fmt.Println("移動座標:", int(event.X), int(event.Y))
})
//添加鼠標按下事件
//BUTTON_PRESS_MASK: 鼠標按下,觸發信號"button-press-event"
//BUTTON_RELEASE_MASK:鼠標擡起,觸發"button-release-event"
//鼠標移動都是觸發"motion-notify-event"
//BUTTON_MOTION_MASK: 鼠標移動,按下任何鍵移動都可以
//BUTTON1_MOTION_MASK:鼠標移動,按住左鍵移動才觸發
//BUTTON2_MOTION_MASK:鼠標移動,按住中間鍵移動才觸發
//BUTTON3_MOTION_MASK:鼠標移動,按住右鍵移動才觸發
window.SetEvents(int(gdk.BUTTON_PRESS_MASK | gdk.BUTTON1_MOTION_MASK))
window.Connect("destroy", gtk.MainQuit) //關閉窗口
window.ShowAll() //顯示控件
gtk.Main()
}
座標說明:
程序運行效果: