Go版GTK:鼠標事件應用—窗口移動

創建窗口時,如果指定類型爲彈出類型,即爲無邊框窗口,這時候,無法通過邊框移動窗口,這時可以藉助鼠標點擊、移動事件實現窗口的移動。

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

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

示例代碼:

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_POPUP) //新建窗口,彈出類型,即爲無邊框窗口
    window.SetPosition(gtk.WIN_POS_CENTER)    //默認居中顯示
    window.SetDefaultSize(480, 320)           //設置大小

    var x, y int

    //鼠標按下事件處理
    window.Connect("button-press-event", func(ctx *glib.CallbackContext) {
        //獲取鼠鍵按下屬性結構體變量,系統內部的變量,不是用戶傳參變量
        arg := ctx.Args(0)
        event := *(**gdk.EventButton)(unsafe.Pointer(&arg))

        if event.Button == 1 { //左鍵
            x, y = int(event.X), int(event.Y) //保存點擊的起點座標
        } else if event.Button == 3 { //右鍵
            //右鍵,關閉窗口
            gtk.MainQuit()
        }
    })

    //鼠標移動事件處理
    window.Connect("motion-notify-event", func(ctx *glib.CallbackContext) {
        //獲取鼠標屬性結構體變量,系統內部的變量,不是用戶傳參變量
        arg := ctx.Args(0)
        //還是EventButton
        event := *(**gdk.EventButton)(unsafe.Pointer(&arg))

        //移動窗口
        window.Move(int(event.XRoot)-x, int(event.YRoot)-y)
    })

    //添加鼠標按下事件
    window.SetEvents(int(gdk.BUTTON_PRESS_MASK | gdk.BUTTON1_MOTION_MASK))

    window.ShowAll() //顯示控件

    gtk.Main()
}

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