【问题标题】:Transparent Floating GtkEntry透明浮动 GtkEntry
【发布时间】:2020-01-01 10:52:28
【问题描述】:

我想开发一款可以接受多语言输入的游戏,包括 CJK 字符。是否有可能让 GtkDrawingArea 填充整个窗口并让 GtkEntry 浮动“在其顶部”?也可以使 GtkEntry 的背景和边框透明吗?感谢您的帮助。

【问题讨论】:

    标签: c gtk gtkentry


    【解决方案1】:

    这是我在my application 中的操作方法,其中一个函数可以在父窗口小部件顶部弹出一个包含一些文本的GtkEntry,位于相对于父窗口小部件左上角的坐标 (x,y) 处:

    GtkWidget *
    popup_edit_window(GtkWidget *parent, gint x, gint y, const gchar *text)
    {
        gint px, py;
        gdk_window_get_origin(gtk_widget_get_window(parent), &px, &py);
    
        GtkWidget *edit_popup = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /* stackoverflow.com/questions/1925568/how-to-give-keyboard-focus-to-a-pop-up-gtk-window */
        GTK_WIDGET_SET_FLAGS(edit_popup, GTK_CAN_FOCUS);
        gtk_window_set_decorated(GTK_WINDOW(edit_popup), FALSE);
        gtk_window_set_has_frame(GTK_WINDOW(edit_popup), FALSE);
        gtk_window_set_type_hint(GTK_WINDOW(edit_popup), GDK_WINDOW_TYPE_HINT_POPUP_MENU);
        gtk_window_set_transient_for(GTK_WINDOW(edit_popup), GTK_WINDOW(parent));
        gtk_window_set_gravity(GTK_WINDOW(edit_popup), GDK_GRAVITY_CENTER);
    
        GtkWidget *entry = gtk_entry_new();
        gtk_widget_add_events(entry, GDK_FOCUS_CHANGE_MASK);
        gtk_entry_set_text(GTK_ENTRY(entry), text);
    
        gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1);
        gtk_container_add(GTK_CONTAINER(edit_popup), entry);
        g_signal_connect_swapped(entry, "focus-out-event", G_CALLBACK(gtk_widget_destroy), edit_popup);
        g_signal_connect(entry, "key-press-event", G_CALLBACK(on_edit_popup_key_press), edit_popup);
    
        gtk_widget_show_all(edit_popup);
        gtk_window_move(GTK_WINDOW(edit_popup), x + px, y + py);
        /* GDK_GRAVITY_CENTER seems to have no effect? */
        gtk_widget_grab_focus(entry);
        gtk_window_present(GTK_WINDOW(edit_popup));
    
        return edit_popup;
    }
    
    gboolean
    on_edit_popup_key_press(GtkWidget *entry, GdkEventKey *event, GtkWidget *edit_popup)
    {
        switch(event->keyval) {
        case GDK_Escape:
            gtk_widget_destroy(edit_popup);
            return TRUE;
        case GDK_Return:
        case GDK_KP_Enter:
            /* here, do whatever you need to do when finished editing */
            gtk_widget_destroy(edit_popup);
            return TRUE;
        }
        return FALSE; /* event not handled */
    }
    

    要使其透明,您应该能够做到:

    gtk_window_set_opacity(GTK_WINDOW(edit_popup), 0.5);
    

    但请注意,您的窗口管理器可能不支持,或者可能选择忽略它。

    但是,您是否考虑过 GTK 有相关的输入法库,因此用户可以选择任何他们想要输入 CJK 字符的输入法?无需重新发明轮子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2016-09-26
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多