Tôi đã phát triển một cửa sổ bật lên (Không được trang trí) bằng GTK + và công cụ lấp lánh trong C. Nó bật lên trên cửa sổ chính khi nút được nhấp. Tôi muốn hủy hoặc ẩn cửa sổ bật lên này khi người dùng nhấp vào bên cạnh cửa sổ này. Người dùng có thể nhấp vào cửa sổ cha hoặc bất kỳ cửa sổ nào khác. Tôi đã cố chụp GDK_FOCUS_CHANGE
sự kiện nhưng tôi không thể nắm bắt sự kiện này. Có bất kì cách nào để đạt được điều này không? Làm thế nào để tôi biết rằng nhấp chuột là trên cửa sổ khác sau đó bật lên cửa sổ? Làm thế nào là nó rõ ràng rằng cửa sổ bật lên đã mất tập trung của nó? Để tôi có thể ẩn nó. Mã liên quan như sau:Cách ẩn Cửa sổ bật lên Gtk khi người dùng nhấp vào bên ngoài cửa sổ
/*
* Compile me with:
gcc -o popup popup.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)
*/
#include <gtk/gtk.h>
static void on_popup_clicked (GtkButton*, GtkWidget*);
static gboolean on_popup_window_event(GtkWidget*, GdkEventExpose*);
int main (int argc, char *argv[])
{
GtkWidget *window, *button, *vbox;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Parent window");
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
gtk_widget_set_size_request (window, 300, 300);
gtk_window_set_position (GTK_WINDOW (window),GTK_WIN_POS_CENTER);
button = gtk_button_new_with_label("Pop Up");
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (on_popup_clicked),(gpointer) window);
vbox = gtk_vbox_new (FALSE, 3);
gtk_box_pack_end(GTK_BOX (vbox), button, FALSE, FALSE, 5);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show_all (window);
gtk_main();
return 0;
}
void on_popup_clicked (GtkButton* button, GtkWidget* pWindow)
{
GtkWidget *popup_window;
popup_window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_title (GTK_WINDOW (popup_window), "Pop Up window");
gtk_container_set_border_width (GTK_CONTAINER (popup_window), 10);
gtk_window_set_resizable(GTK_WINDOW (popup_window), FALSE);
gtk_window_set_decorated(GTK_WINDOW (popup_window), FALSE);
gtk_widget_set_size_request (popup_window, 150, 150);
gtk_window_set_transient_for(GTK_WINDOW (popup_window),GTK_WINDOW (pWindow));
gtk_window_set_position (GTK_WINDOW (popup_window),GTK_WIN_POS_CENTER);
g_signal_connect (G_OBJECT (button), "event",
G_CALLBACK (on_popup_window_event),NULL);
GdkColor color;
gdk_color_parse("#3b3131", &color);
gtk_widget_modify_bg(GTK_WIDGET(popup_window), GTK_STATE_NORMAL, &color);
gtk_widget_show_all (popup_window);
}
gboolean on_popup_window_event(GtkWidget *popup_window, GdkEventExpose *event)
{
if(event->type == GDK_FOCUS_CHANGE)
gtk_widget_hide (popup_window);
return FALSE;
}
Ở đây tôi không thể để ẩn cửa sổ pop này lên cửa sổ khi người dùng nhấp vào cửa sổ cha mẹ hoặc trên cửa sổ khác. Tôi có thể làm cái này như thế nào?
Tôi phải gắn bó với phiên bản Gtk + 2.14.
Vui lòng không trả lời câu hỏi. Điều này có vẻ là một sự lặp lại tốt hơn (được trình bày tốt hơn) của http://stackoverflow.com/questions/1740947/problem-with-gtk-popup-window-focus-change-event-handling – mlibby
Tôi sẽ chăm sóc điều này trong tương lai. – kbalar