Gtk 移动窗口超出限制

Posted

技术标签:

【中文标题】Gtk 移动窗口超出限制【英文标题】:Gtk Move window beyond constraints 【发布时间】:2016-10-22 12:43:12 【问题描述】:

我目前正在编写一个使用自定义标题栏的 gtk 程序(即,它没有被窗口管理器修饰)。但由于使用自定义标题栏也会禁用对拖动窗口的支持,我编写了自定义拖动函数,通过调用 window.move(x, y) 来移动窗口:

bool on_titlebar_drag(GdkEvent* event)
 
    static int drag_x_offset = 0; 
    static int drag_y_offset = 0; 
    int x, y; 

    if (event->type == GDK_BUTTON_PRESS) 
     
        drag_x_offset = event->button.x; 
        drag_y_offset = event->button.y; 
     else if(event->type == GDK_BUTTON_RELEASE)  
        drag_x_offset = 0; 
        drag_y_offset = 0;
     else if(event->type == GDK_MOTION_NOTIFY)  
        x = event->motion.x_root - drag_x_offset; 
        y = event->motion.y_root - drag_y_offset; 
        mainWindow.move(x, y);
    

    return true; 

这工作得很好,除了它不能将窗口移动到屏幕限制之外,就像其他窗口的正常行为一样,所以你可以将它拖到“看不见的地方”来为其他窗口腾出位置。

我试图通过调用window.resize(width, height) 将窗口一接触屏幕就缩小,但这不是我打算做的,因为调整大小也会将窗口内容调整为更小的比例,而我只是想使其物理尺寸更小。 我也试过使用set_allocationsize_allocate,这两个根本没有做任何改变。

我的问题是,您是否知道一种方法可以将窗口移动到屏幕边框之外(不完全是,但以某种方式使窗口不完全在屏幕上),或者改变窗口的大小不调整其内容大小的窗口?

【问题讨论】:

什么版本的 GTK+? 请发布您的拖动代码。还有你用的什么自定义标题栏,GtkHeaderBar? 不,我只是在使用一个包含一些自定义按钮和标题标签的框。我使用的代码没有非常基本的调整大小 - 这里是: 考虑使用GtkHeaderBar;它像 GtkBox 一样工作,但也提供了你想要的拖动行为。至于你的代码,gtk_window_move() 不是这样工作的,事实上gtk_window_move() 不能保证工作;您需要改用gtk_window_begin_move_drag()。如果任一选项有效,我可以详细说明答案。 终于有时间再看一遍了^^嗯,非常感谢您的回复。我现在正在使用 GtkHeaderBar,但这不提供我认为的任何拖动功能?至少我没有找到。但是使用begin_move_drag() 正是我想要的,谢谢:) 【参考方案1】:

如果您使用的是 GTK 3.10 或更新版本,您可以使用gtk_window_set_titlebar

gtk_window_set_titlebar (GtkWindow *window, GtkWidget *titlebar) 您需要的唯一参数是您要自定义的窗口和将用作标题栏的 GtkWidget。建议使用GtkHeaderBar,但在您的情况下,您可以使用任何自定义 GtkWidget 并获得可拖动的栏,该栏将像窗口管理器中的那样拖拽整个窗口。

【讨论】:

以上是关于Gtk 移动窗口超出限制的主要内容,如果未能解决你的问题,请参考以下文章

Gtk 应用程序窗口是不是有鼠标移动回调?

请问delphi 的panel 怎么移动啊,就在自己的窗口中移动,不要超出窗口!谢谢!

如何使用本机寡妇 api 移动 Gtk::Window?

Gtk+:如何从 Cairo 上下文中设置窗口的光标?

在窗口范围内限制/移动上下文菜单(右键单击)

Go语言图形界面开发:Go版GTK