Go版GTK:鼠标事件应用—窗口移动

原文地址:https://blog.csdn.net/tennysonsky/article/details/79284225

创建窗口时,如果指定类型为弹出类型,即为无边框窗口,这时候,无法通过边框移动窗口,这时可以借助鼠标点击、移动事件实现窗口的移动。

坐标说明: 
这里写图片描述

移动坐标说明: 
这里写图片描述

示例代码:

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()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将一个 wxWidgets 的应用程序嵌入到一个现有的 GTK 窗口中,你可以使用 GTK 的 `GtkSocket` 和 wxWidgets 的 `wxSocketGTK` 类。这样可以在 GTK 窗口中创建一个容器,然后将 wxWidgets 的应用程序嵌入到这个容器中。 下面是一个示例代码: ```cpp #include <wx/wx.h> #include <wx/socket.h> #include <gtk/gtk.h> // wxWidgets 应用程序类 class MyApp : public wxApp { public: virtual bool OnInit() { // 创建一个 wxFrame 对象 wxFrame* frame = new wxFrame(NULL, wxID_ANY, "wxWidgets Frame"); // 创建一个 wxPanel 对象作为容器 wxPanel* panel = new wxPanel(frame, wxID_ANY); // 创建一个 wxButton 对象作为内容 wxButton* button = new wxButton(panel, wxID_ANY, "wxWidgets Button"); // 显示 wxFrame frame->Show(); // 将 wxWidgets 应用程序嵌入到 GTK 窗口GtkWidget* gtkSocket = gtk_socket_new(); gtk_container_add(GTK_CONTAINER(panel->GetHandle()), gtkSocket); gtk_widget_show(gtkSocket); // 创建一个 wxSocketGTK 对象,并将它与 gtkSocket 相关联 wxSocketGTK* socket = new wxSocketGTK(gtkSocket); return true; } }; // 主函数 int main(int argc, char** argv) { // 初始化 GTK gtk_init(&argc, &argv); // 创建和运行 wxWidgets 应用程序 MyApp app; wxApp::SetInstance(&app); wxEntry(argc, argv); return 0; } ``` 在这个示例中,我们首先初始化 GTK,并创建一个 GTK 的 `GtkSocket` 对象。然后,我们创建一个 wxWidgets 的 `wxFrame` 对象,并在其中创建一个 wxPanel 作为容器。接下来,我们创建一个 wxButton 对象作为容器的内容,并将它添加到 wxPanel 中。 然后,我们将 wxWidgets 应用程序嵌入到 GTK 窗口中。我们创建一个 `wxSocketGTK` 对象,并将它与 `GtkSocket` 相关联。通过将 `GtkSocket` 添加到 wxPanel 中,我们将 wxWidgets 的应用程序嵌入到了 GTK 窗口中。 请注意,这里假设你已经正确地设置了 wxWidgets 和 GTK 的开发环境,并正确地包含了相应的头文件和库。此外,需要使用 GTK2 本的 wxWidgets,并且需要在编译时链接正确的库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值