Go语言图形界面开发GTK:Go语言版黑白棋(二):无边框窗口实现

  • A+
所属分类:Golang

功能说明

需要实现功能为,给窗口去表框,却可以通过鼠标实现移动。

glade界面设计

Go语言图形界面开发GTK:Go语言版黑白棋(二):无边框窗口实现

示例代码

```
package main

import (
"fmt"
"os"
"unsafe"

"github.com/mattn/go-gtk/gdk"
//  "github.com/mattn/go-gtk/gdkpixbuf"
"github.com/mattn/go-gtk/glib"
"github.com/mattn/go-gtk/gtk"

)

//控件结构体
type ChessWidet struct {
window *gtk.Window //窗口
}

//属性结构体
type ChessInfo struct {
w, h int //窗口的宽度高度
x, y int //鼠标点击坐标(相对于窗口)

}

type Chessboard struct {
//匿名字段
ChessWidet
ChessInfo
}

//Chessboard的方法,获取控件,设置控件属性,返回主窗口控件指针
func (obj Chessboard) CreateWindow() gtk.Window {
builder := gtk.NewBuilder() //新建builder
builder.AddFromFile("ui.glade") //读取glade文件

//获取glade对应的控件
obj.window = gtk.WindowFromObject(builder.GetObject("window1")) //获取窗口控件

//设置属性
//窗口属性
obj.w = 800
obj.h = 480
obj.window.SetSizeRequest(obj.w, obj.h)    //设置窗口大小
obj.window.SetPosition(gtk.WIN_POS_CENTER) //居中显示
obj.window.SetAppPaintable(true)           //允许窗口能绘图(重要)
obj.window.SetDecorated(false)             //去表框
//添加鼠标按下事件
obj.window.SetEvents(int(gdk.BUTTON_PRESS_MASK | gdk.BUTTON1_MOTION_MASK))

return obj.window

}

//鼠标按下事件处理,MousePressEvent为其回调函数,把obj传递给回调函数
func MousePressEvent(ctx glib.CallbackContext) {
arg := ctx.Data() //获取用户传递的参数,是空接口类型
obj, ok := arg.(
Chessboard) //类型断言
if false == ok { //如果ok为false,说明类型断言错误
fmt.Println("arg.(*Chessboard) err")
return
}

//获取鼠键按下属性结构体变量,系统内部的变量,不是用户传参变量
tmp := ctx.Args(0)
event := *(**gdk.EventButton)(unsafe.Pointer(&tmp))
if event.Button == 1 { //左键
    obj.x, obj.y = int(event.X), int(event.Y) //保存点击的起点坐标
}

}

//方法,事件、信号处理,回调函数如果简单使用匿名函数,否则自定义函数
func (obj *Chessboard) HandleSignal() {

//鼠标按下事件处理,MousePressEvent为其回调函数,把obj传递给回调函数
obj.window.Connect("button-press-event", MousePressEvent, obj)

//鼠标移动事件处理,实现窗口的移动
obj.window.Connect("motion-notify-event", func(ctx *glib.CallbackContext) {
    //获取鼠标属性结构体变量,系统内部的变量,不是用户传参变量
    arg := ctx.Args(0)
    //还是EventButton
    event := *(**gdk.EventButton)(unsafe.Pointer(&arg))

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

}

func main() {
gtk.Init(&os.Args)

var obj Chessboard //创建结构体变量

//创建控件,设计属性
window := obj.CreateWindow()

//事件、信号处理
obj.HandleSignal()

//显示控件
window.ShowAll()

gtk.Main()

}

```

程序运行效果就是一个无边框的窗口,但是,在窗口上可以通过按住鼠标左键移动。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin