首页 > 其他分享 >Go语言版黑白棋(三):背景图、最小化、关闭窗口

Go语言版黑白棋(三):背景图、最小化、关闭窗口

时间:2022-09-28 21:08:11浏览次数:60  
标签:黑白棋 obj gtk window func Go 窗口 背景图 event


功能说明

Go语言版黑白棋(三):背景图、最小化、关闭窗口_回调函数

设置一张背景图,增加2个按钮:最小化、关闭窗口。

glade界面设计

Go语言版黑白棋(三):背景图、最小化、关闭窗口_回调函数_02

Go语言版黑白棋(三):背景图、最小化、关闭窗口_回调函数_03

Go语言版黑白棋(三):背景图、最小化、关闭窗口_gtk_04

Go语言版黑白棋(三):背景图、最小化、关闭窗口_go_05

Go语言版黑白棋(三):背景图、最小化、关闭窗口_黑白棋_06

示例代码

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 //窗口
buttonMin *gtk.Button //最小化按钮
buttonClose *gtk.Button //关闭按钮
}

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

}

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

//函数,给按钮设置图片
func ButtonSetImageFromFile(button *gtk.Button, filename string) {
//获取按钮的宽度和高度
var w, h int
button.GetSizeRequest(&w, &h)
//获取pixbuf,指定其大小
pixbuf, _ := gdkpixbuf.NewPixbufFromFileAtScale(filename, w-10, h-10, false)

//通过pixbuf新建image
image := gtk.NewImageFromPixbuf(pixbuf)
//按钮设置图片
button.SetImage(image)

//释放资源
pixbuf.Unref()
}

//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.buttonMin = gtk.ButtonFromObject(builder.GetObject("buttonMin")) //按钮
obj.buttonClose = gtk.ButtonFromObject(builder.GetObject("buttonClose"))

//设置属性
//窗口属性
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))

//按钮属性
ButtonSetImageFromFile(obj.buttonMin, "image/min.png") //给按钮设置图片,此为自定义函数
ButtonSetImageFromFile(obj.buttonClose, "image/close.png")
obj.buttonMin.SetCanFocus(false) //去掉按钮上的聚焦框
obj.buttonClose.SetCanFocus(false)

return obj.window
}

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

//指定窗口为绘图区域,在窗口上绘图
painter := obj.window.GetWindow().GetDrawable()
gc := gdk.NewGC(painter)

//设置背景图的pixbuf,其宽高和窗口一样,最后一个参数固定为false
bg, _ := gdkpixbuf.NewPixbufFromFileAtScale("./image/bg.jpg", obj.w, obj.h, false)

//画图,画背景图
painter.DrawPixbuf(gc, bg, 0, 0, 0, 0, -1, -1, gdk.RGB_DITHER_NONE, 0, 0)

//释放资源
bg.Unref()
}

//鼠标按下事件处理,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)
})

//改变窗口大小时,触发"configure-event",然后手动刷新绘图区域,否则图片会重叠
obj.window.Connect("configure-event", func() {
obj.window.QueueDraw() //刷新绘图区域
})

//绘图(曝光)事件,其回调函数PaintEvent做绘图操作,把obj传递给回调函数
obj.window.Connect("expose-event", PaintEvent, obj)

//最小化按钮信号处理
obj.buttonMin.Connect("clicked", func() {
obj.window.Iconify() //窗口最小化
})

//关闭按钮信号处理
obj.buttonClose.Connect("clicked", func() {
gtk.MainQuit() //程序结束
})
}

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

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

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

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

//显示控件
window.ShowAll()

gtk.Main()
}

程序运行效果:

Go语言版黑白棋(三):背景图、最小化、关闭窗口_go_07



标签:黑白棋,obj,gtk,window,func,Go,窗口,背景图,event
From: https://blog.51cto.com/u_3002289/5720807

相关文章

  • Go语言版黑白棋(二):无边框窗口实现
    功能说明需要实现功能为,给窗口去表框,却可以通过鼠标实现移动。glade界面设计示例代码packagemainimport("fmt""os""unsafe""github.com/mattn/go-gtk/gdk......
  • Go入门教程
    基础编程​​01、Go语言介绍​​​​02、环境搭建​​​​03、第一个Go程序​​​​04、命名、变量、常量​​​​05、基础数据类型​​​​06、格式化输出、类型转换、类型......
  • Go基础编程:复合类型—切片slice
    1.概述数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。Go语言提供了数组切片(slice)来弥补数组的......
  • Go基础编程:环境搭建
    安装和设置​​Go环境搭建:ubuntu+sublime3​​​​Go环境搭建:ubuntu+liteide​​​​Go环境搭建:windows+sublime3​​​​Go环境搭建:windows+liteide​​标准命令概述Go语言......
  • Go环境搭建:windows+liteide
    Go语言环境安装请参考:​​Go语言环境安装​​Go语言环境测试请参考:​​Go语言环境测试​​LiteIDE安装LiteIDE是一款简单,开源,跨平台的GoIDE。官网:​​http://liteide.org......
  • Go环境搭建:windows+sublime3
    Go语言环境安装Go安装包下载网址:​​https://www.golangtc.com/download​​有zip压缩版和msi安装版两个按本下载。(这里使用msi安装版,比较方便)。运行msi安装文件,千万不要在......
  • golang之Time时间函数
    总结常用time包下的方法1)获取前一天的时间packagemainimport"time"nowTime:=time.Now()yesterdayTime:=nowTime.AddDate(0,0,-1);//年,月,日获取前一......
  • Go基础编程:并发编程—goroutine
    1goroutine是什么goroutine是Go并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goro......
  • Go基础编程:基础数据类型
    分类Go语言内置以下这些基础类型:类型名称长度零值说明bool布尔类型1false其值不为真即为假,不可以用数字代表true或falsebyte字节型10uint8别名rune字符类型40专用于存储unic......
  • golang 的双向循环链表
                如下为go实现的双向循环列表。packagemainimport("fmt")typeRingstruct{prev,......