Gtk移动窗口超出约束

时间:2016-10-22 12:43:12

标签: c++ c gtk gtkmm

我目前正在编写一个使用自定义标题栏的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,这两个根本没有任何改变。

我的问题是,你知道一种方法可以将窗口移出屏幕边界(不完全,但窗口不完全在屏幕上),或改变窗口大小窗口没有调整其内容的大小?

1 个答案:

答案 0 :(得分:1)

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

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