Go版GTK:常用事件—鼠標事件

鼠標事件,可以理解爲操作鼠標的動作。對於窗口而言,用戶操作鼠標,窗口檢測到鼠標的操作( 產生一個信號 ),然後去做相應處理( 調用其規定的回調函數 ),即爲鼠標事件。

窗口默認不捕獲鼠標的操作,需要手動添加讓其捕獲:

    //添加鼠標按下事件
    //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()
}

座標說明:
這裏寫圖片描述

程序運行效果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章